CSV - 删除任何列为空的行

时间:2013-10-06 22:12:55

标签: unix csv text

我正在玩Kaggle的泰坦尼克号数据集。我想从train.csv中删除任何有空列的行(我知道这不是处理缺失数据的最佳方法,但这个问题对我来说很有意思。)

我想做这种Unix式的方式(使用像awk,sed或grep这样的东西),因为我试图在这些工具上做得更好,但我甚至不确定从哪里开始。< / p>

数据示例:

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

在第二行,舱室是空的,所以我想将其从文件中删除。

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

ASIDE:

我也想知道如何仅针对特定列进行此操作,但我可以将此问题作为一个单独的问题,如果这个问题的答案无法帮助我回答这个问题。

3 个答案:

答案 0 :(得分: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)

假设代码位于名为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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

以下是使用sed

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

这将删除包含,,的所有行,以,结尾并以,

开头

\s*还允许删除包含任何仅填充空格的单元格的行。

对于特定列

您可以尝试awk

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

$n中,将n替换为所需的列号。