将pd.read_csv跳过的行保存到单独的DataFrame中
代码示例:
data = 'a,b,c\n1,2,3\n4,5,6,7\n8,9,10'
pd.read_csv(StringIO(data), error_bad_lines=False)
Skipping line 3: expected 3 fields, saw 4
我想要的是把那些被跳过的行提取出来,然后保存到其他地方,比如另一个数据框(DataFrame)或者数组(Array)。
我处理的每个文件大约有8000行,列数在4到12之间,而那些被跳过的行里有一些我不想丢失的重要信息。
我尝试使用
try:
pd.read_csv(StringIO(data), error_bad_lines=False)
except(pd.parser.CParserError)
我该如何捕捉到“坏行”?
1 个回答
1
我不太确定官方推荐的方法是什么,但我通常会先传入 names
,然后再进行后续处理。例如:
>>> pd.read_csv(StringIO(data), names=["a", "b", "c", "other stuff"], skiprows=1)
a b c other stuff
0 1 2 3 NaN
1 4 5 6 7
2 8 9 10 NaN
之后,你可以使用布尔过滤,比如 df[df['other stuff'].notnull()]
来选择那些有额外数据的项。
我甚至以前做过这样的事情:
>>> pd.read_csv(StringIO(data), names=range(10), header=None)
0 1 2 3 4 5 6 7 8 9
0 a b c NaN NaN NaN NaN NaN NaN NaN
1 1 2 3 NaN NaN NaN NaN NaN NaN NaN
2 4 5 6 7 NaN NaN NaN NaN NaN NaN
3 8 9 10 NaN NaN NaN NaN NaN NaN NaN
但那样的话,你得确保最后把数据类型转换得合适,这样就不会出现性能较慢的对象,而是用浮点数。通常我只把这个当作一个中间步骤,然后立刻写出格式更好的csv文件,所以这其实没什么大不了的。
(我一直想要一种“无损”的数据读取方法,不在乎性能,只在乎能把所有数据都读进来,不过据我所知,可能已经有这样的方式了。)