代码示例:

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。

我实际处理的每个文件的长度约为8K行,具有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

最佳答案

不知道Official(tm)方法是什么,但是我经常通过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


要开始使用以前的方法,但随后必须确保在末尾适当地转换dtypes,以便在有浮点数时不会出现性能较慢的对象。不过,我通常只将其用作中间步骤,然后立即写出格式更好的csv,因此没关系。

(我想要一种“无损”数据读取方法,在这种方法中,您不必关心性能,只关心获取所有数据,但就我所知,已经有一种数据读取方法。)

10-04 15:57