访问 pandas.read_excel() 转换器中 ValueError 的详细信息

Posted

技术标签:

【中文标题】访问 pandas.read_excel() 转换器中 ValueError 的详细信息【英文标题】:Access specifics of ValueError in pandas.read_excel() converters 【发布时间】: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%”是问题)并告诉用户它在数据帧/文件中出现的位置。如何从异常中获取该信息以获取行索引并打印整行?

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

【问题讨论】:

【参考方案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 是的,对不起,它应该是一个字符串,我更新了它。

以上是关于访问 pandas.read_excel() 转换器中 ValueError 的详细信息的主要内容,如果未能解决你的问题,请参考以下文章

带有超链接的 Pandas read_excel

pandas.read_excel,第一行值

编码参数是不是适用于 pandas.read_excel?

Pandas:将列转换为唯一列表

通过 pandas.read_excel 在标题后跳过行范围

IOError: [Errno 22] 使用 pandas.read_excel 的无效模式 ('rb')