2

我正在使用来自 Kaggle 的泰坦尼克号数据集。我想从 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

在第二行,小屋是空的,所以我想从文件中删除它。

请注意,第四列有时包含逗号,但该列始终包含在双引号中。

在旁边:

我还想知道如何仅针对特定列执行此操作,但如果此问题的答案不能帮助我回答该问题,我可以将其作为一个单独的问题提出。

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 回答
2

如何排除包含,,或结尾,或开头的行,

cat data.txt | sed -e '/,,/d' -e '/^,/d' -e '/,$/d'

这并不完美,因为引用的文本可能包含,,,这并不意味着空列。但也许这已经足够好了?你当法官!

于 2013-10-06T22:19:20.433 回答