我有一系列非常脏的 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
Run Code Online (Sandbox Code Playgroud)
正如你在上面看到的,有 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})
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何告诉系统我有 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)
Run Code Online (Sandbox Code Playgroud)
回复:
raise ValueError("header must be integer or list of integers")
ValueError: header must be integer or list of integers
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果行的值太少或太多 ( ),则无法跳过它们error_bad_lines=False。
通过使用header=None它,将第一个未跳过的行作为正确的列数,这意味着第 4 行不好(列太多)。
您可以从文件中读取列名或将列名传递给read_csv(),例如
df = pd.read_csv(file, skiprows=1, dtype=str, header=0)
Run Code Online (Sandbox Code Playgroud)
或者:
cols = ['RecCtr', 'Attom_ID', 'PeopleID', 'First_Name', 'Last_Name', ...]
df = pd.read_csv(file, skiprows=2, dtype=str, names=cols)
Run Code Online (Sandbox Code Playgroud)
它修复了正确的列数,然后它会1-4毫无错误地解析行并1-3用NaNs 填充缺失的列。
如果您知道最后一列(或任何其他列)应该有值,那么您可以删除NaN该列中的行:
df.dropna(subset=['Phone Type'])
Run Code Online (Sandbox Code Playgroud)
或者:
df[df['Phone Type'].notnull()]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3284 次 |
| 最近记录: |