在 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
在继续操作之前,我使用以下方法确保数据框列具有正确的数据类型:
>>> 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