1.4.0 新特性
从 pandas
1.4.0
开始,read_csv()
函数提供了一种功能,允许您通过将回调函数分配给 on_bad_lines=
来更加优雅、智能地处理这些情况。
例如,假设有一个可能导致错误数据的 CSV
文件:Expected 4 fields in line 3, saw 5
:
C1,C2,C3,C4
10,11,12,13
25,26,27,28,garbage
80,81,82,83
以下lambda函数简单地忽略了坏行中的最后一列(正如上面的原始问题陈述所期望的那样):
df = pd.read_csv('your.csv', on_bad_lines=lambda x: x[:-1], engine='python')
df
C1 C2 C3 C4
0 10 11 12 13
1 25 26 27 28
2 80 81 82 83
on_bad_lines
这个可调用函数会在每行出错时被调用,其函数签名为(bad_line: list[str]) -> list[str] | None
。如果该函数返回None
,则该行将被忽略。如你所见,engine='python'
是必需的。
最棒的是,它为编写任何你想要的细粒度逻辑以解决问题打开了大门。
例如,假设你想从行的开头或结尾删除错误数据,并且如果在开头和结尾都有错误数据,则只需忽略该行:
CSV
C1,C2,C3,C4
10,11,12,13
20,21,22,23,garbage
60,61,62,63
trash,80,81,82,83
trash,90,91,82,garbage
函数定义
def line_fixer(x):
if not x[0].isnumeric() and x[-1].isnumeric():
return x[1:]
if not x[-1].isnumeric() and x[0].isnumeric():
return x[:-1]
return None
结果
df = pd.read_csv('your.csv', on_bad_lines=line_fixer, engine='python')
df
C1 C2 C3 C4
0 10 11 12 13
1 20 21 22 23
2 60 61 62 63
3 80 81 82 83
warn_bad_lines=True
可能进一步帮助诊断有问题的行。 - Herpes Free Engineer