【问题标题】:Access specifics of ValueError in pandas.read_excel() converters访问 pandas.read_excel() 转换器中 ValueError 的详细信息
【发布时间】:2018-09-28 21:15:51
【问题描述】:

在继续操作之前,我使用以下方法确保数据框列具有正确的数据类型:

>>> cfun = lambda x: float(x)
>>> df = pd.read_excel(xl, converters={'column1': cfun})

使用转换器而不是 dtype,以便回溯会明确告诉我是什么值导致了问题:

ValueError: could not convert string to float: '100%'

我想要做的是获取该信息(字符串“100%”是问题)并告诉用户它在数据帧/文件中出现的位置。如何从异常中获取该信息以获取行索引并打印整行?

注意:添加百分号并不是我的用户所犯的唯一错误,否则我只需将任何 '%' 替换为 ''。

【问题讨论】:

    标签: python pandas traceback valueerror converters


    【解决方案1】:

    我认为您可以通过首先读取 csv 来检查,然后检查哪些行不会转换。这会一次找到它们,而不是使用ValueError 一个一个地找到它们。

    请记住,python 从 0 开始编号并且不会包含标题,因此 df 的行索引将与 csv 中的行索引不同(相差 1 或 2)。

    import pandas as pd
    df = pd.read_excel(xl)
    
    # Example df
       column1 column2
    0      100       A
    1     100%       B
    2  112,312       C
    3      171       D
    4  123.123       E
    5      NaN       F
    
    df['column1_num'] = pd.to_numeric(df.column1, errors='coerce')
    bad_mask = (df.column1_num.isnull()) & ~(df.column1.astype('str').str.lower().isin(['nan']))
    
    bad_rows = df[bad_mask].index.values
    #array([1, 2], dtype=int64)
    
    df[bad_mask]
    #   column1 column2  column1_num
    #1     100%       B          NaN
    #2  112,312       C          NaN
    

    我更新了掩码,因为float 能够处理'NaN' 字符串,因此它实际上不会在您的阅读中显示为问题,尽管pd.to_numeric 仍将其强制转换为NaN

    float('NaN')
    #nan
    pd.to_numeric('NaN')
    #ValueError: Unable to parse string "NaN" at position 0
    

    【讨论】:

    • 你知道为什么我会在 bad_mask 行上得到一个 AttributeError 吗? "只能使用带有字符串值的 .str 访问器,在 pandas 中使用 np.object_ dtype
    • @ExcelHelp 是的,对不起,它应该是一个字符串,我更新了它。
    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多