python - 在 python read_csv 执行中处理坏行

标签 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

最佳答案

不幸的是,如果行的值太少但太多( 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/

相关文章:

pandas - Pandas 的两个日期时间之间是否存在给定日期和月份的日期?

python - 从 2 个列表的笛卡尔积创建新的 DataFrame

python - 查找百分比标记

python - 如何在 Pandas 的一次热编码中处理未知的分类值

python - 用 pandas 替换字符串中除最后出现的字符之外的所有字符

python - 仅当某些值相等时,如何才能将一个文本文件中的值替换为另一个文本文件中的其他值?

python - 删除行索引并将其恢复为列

python - 删除特定的键但不删除值(列表),因此它成为上键的元素

python - 如何从python中的给定日期获取工作日?

python - 如何防止Python代码的目录遍历攻击