将pd.read_csv跳过的行保存到单独的DataFrame中

1 投票
1 回答
1139 浏览
提问于 2025-04-18 09:35

代码示例:

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)

我该如何捕捉到“坏行”?

其中一个文件: http://www.pjm.com/pub/account/loadhryr/1998.txt

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文件,所以这其实没什么大不了的。

(我一直想要一种“无损”的数据读取方法,不在乎性能,只在乎能把所有数据都读进来,不过据我所知,可能已经有这样的方式了。)

撰写回答