我正在玩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:
我也想知道如何仅针对特定列进行此操作,但我可以将此问题作为一个单独的问题,如果这个问题的答案无法帮助我回答这个问题。
答案 0 :(得分:3)
我会坚持使用具有csv解析器的语言,因为双引号内的逗号可能会有问题。并且更容易扩展以比较特定列。这是python示例。它从标题中提取字段数,并比较每行的数字,以决定是否打印:
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
替换为所需的列号。