访问 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 的详细信息的主要内容,如果未能解决你的问题,请参考以下文章