在pandas.read_excel()转换器中访问ValueError的细节

时间:2018-04-18 14:54:46

标签: python pandas traceback valueerror converters

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

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

使用转换器而不是dtype,以便回溯将明确告诉我导致该问题的值:

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

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

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

1 个答案:

答案 0 :(得分: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 1}}。

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