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

Access specifics of ValueError in pandas.read_excel() converters

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

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

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

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

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

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

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

请记住,python 从 0 开始编号并且不会包含 header,因此 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