2

Kaggle の Titanic データセットで遊んでいます。空の列を持つ行を train.csv から削除したいと思います (これは欠落しているデータを処理する最善の方法ではないことはわかっていますが、この質問は私にとって興味深いものです)。

私はこの Unix タイプの方法 (awk、sed、grep などを使用) を使用したいと思っています。なぜなら、これらのツールをより良くしようとしているからですが、どこから始めればよいかさえわかりません。

データの例:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S

2行目のキャビンは空なので、ファイルから削除したいです。

4 番目の列にはコンマが含まれることがありますが、列は常に二重引用符で囲まれていることに注意してください。

余談:

特定の列に対してのみこれを行う方法も知りたいのですが、この質問への回答がその質問への回答に役立たない場合は、別の質問として尋ねることができます。

4

3 に答える 3

3

二重引用符内のコンマが問題になる可能性があるため、 パーサーを備えた言語に固執します。また、特定の列を比較するように拡張する方が簡単です。ここにの例があります。ヘッダーからフィールドの数を抽出し、各行のその数を比較して、印刷するかどうかを決定します。

import sys 
import csv 

with open(sys.argv[1], 'r', newline='') as csvfile:
    csvreader = csv.reader(csvfile)
    csvwriter = csv.writer(sys.stdout)
    row = next(csvreader)
    fields = len(row)
    csvwriter.writerow(row)
    for row in csvreader:
        l = len(list(filter(str.strip, row)))
        if l < fields: continue
        csvwriter.writerow(row)

name のファイル内のコードを想定して、次のscript.pyように実行します。

python script.py infile

これにより、次の結果が得られます。

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
于 2013-10-06T22:43:33.310 に答える
2

ここに使用する試みがありますsed

sed -r '/(^|,)\s*(,|$)/d' file

,,これにより、 で終わり、,で始まるすべての行が削除されます,

\s*スペースのみで満たされたセルを含む行を削除することもできます。

特定の列について

試してみてくださいawk

awk -F',' '$n{print $0}' file

で、目的の列番号 $nに置き換えます。n

于 2013-10-06T22:29:26.050 に答える