【问题标题】:handling bad lines in a python read_csv execution在 python read_csv 执行中处理坏行
【发布时间】:2020-10-31 14:49:40
【问题描述】:

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    不幸的是,如果行的值太少而太多(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 而不会出错,并用 NaNs 填充 1-3 的缺失列。

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

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

    或者:

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

    【讨论】:

    • 我使用了您的解决方案,但它不起作用。我将其更改为 names=headers 并且有效。
    • 是的,我的错误,已修复。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多