我有一系列非常脏的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行跳过为错误。以及其他人。
谢谢
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
答案 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