代码示例:
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,因此没关系。
(我想要一种“无损”数据读取方法,在这种方法中,您不必关心性能,只关心获取所有数据,但就我所知,已经有一种数据读取方法。)