我有一系列非常脏的 CSV 文件。
它们看起来像这样:
,"File Inputs",,,,,,,,,,,"Email Category",,"Contact Info Category",
RecCtr,Attom_ID,PeopleID,"First Name","Last Name",AddressFullStreet,City,State,Zip," ","Individual Level Match"," ","Email Address"," ",Phone,"Phone Type"
1,19536969,80209511,ANTHONY1,MACCA1,"123 Main RD","Anytown",MA,12345
2,169874349,80707224,ANTHONY2,MACCA2,"123 Main RD","Anytown",MA,12345
3,1057347,81837554,ANTHONY3,MACCA3,"123 Main RD","Anytown",MA,12345
4,36946575,81869227,ANTHONY3,MACCA4,"123 Main RD","Anytown",MA,12345,,YES,,,,1234567890,Mobile
正如你在上面看到的,有 16 个元素。第 1、2、3 行是坏的,第 4 行是好的。我正在使用这段代码试图阅读它们。
df = pd.read_csv(file, skiprows=2, dtype=str, header=None)
df.columns = ['RecCtr', 'Attom_ID', 'PeopleID', 'First_Name', 'Last_Name', 'AddressFullStreet', 'City', 'State', 'Zip', 'blank1', 'Individual_Level_Match', 'blank2', 'Email_Address', 'blank3', 'Phone', 'Phone_Type'
]
df = df.replace({pd.np.nan: None})
我的问题是我不知道如何告诉系统我有 16 个元素,并且应该跳过不是 16 个元素的任何行。看来我的代码中的第 1 行强制第 1-3 行变好,然后第 4 行变坏。
我如何指定有多少列才能将第 1 行作为错误跳过。和其他人一起。
谢谢
改变1:
headers = ['RecCtr', 'Attom_ID', 'PeopleID', 'First_Name', 'Last_Name', 'AddressFullStreet', 'City', 'State', 'Zip', 'blank1', 'Individual_Level_Match', 'blank2', 'Email_Address', 'blank3', 'Phone', 'Phone_Type']
df = pd.read_csv(file, skiprows=2, dtype=str, header=headers)
回复: raise ValueError("header must be integer or list of integers")
ValueError: header must be integer or list of integers
最佳答案
不幸的是,如果行的值太少但太多( error_bad_lines=False
),则不能跳过行。
通过使用 header=None
它将第一个未跳过的行作为正确的列数,这意味着第 4 行不好(列太多)。
您可以从文件中读取列名或将列名传递给 read_csv()
,例如
df = pd.read_csv(file, skiprows=1, dtype=str, header=0)
或者:
cols = ['RecCtr', 'Attom_ID', 'PeopleID', 'First_Name', 'Last_Name', ...]
df = pd.read_csv(file, skiprows=2, dtype=str, names=cols)
它修复了正确的列数,然后它会解析行
1-4
没有错误并填写 1-3
的缺失列与 NaN
s。如果您知道最后一列(或任何其他列)应该有值,那么您可以使用
NaN
删除行在该栏中:df.dropna(subset=['Phone Type'])
或者:
df[df['Phone Type'].notnull()]
关于python - 在 python read_csv 执行中处理坏行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59331694/