在python read_csv执行中处理不良行

时间:2019-12-14 01:47:34

标签: python pandas

我有一系列非常脏的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

2 个答案:

答案 0 :(得分:2)

不幸的是,如果行的值太少而行太多(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的缺失列。

如果您知道最后一列(或任何其他列)应具有值,则可以在该列中删除带有NaN的行:

df.dropna(subset=['Phone Type'])

或者:

df[df['Phone Type'].notnull()]

答案 1 :(得分:0)

如果您的数据中没有列标题,并且您想添加,然后以这种方式尝试,对我有用!

headers = ["col1", "col2", "col3", .....]
df = pd.read_csv("your filename.csv", names = headers)
df