在继续操作之前,我使用以下内容确保数据框列具有正确的数据类型:
>>> cfun = lambda x: float(x)
>>> df = pd.read_excel(xl, converters={'column1': cfun})
使用转换器而不是dtype,以便回溯将明确告诉我导致该问题的值:
ValueError: could not convert string to float: '100%'
我想要做的是获取该信息(字符串" 100%"是问题)并告诉用户它在数据框/文件中的位置。如何从异常中获取该信息以获取行索引,比如打印整行?
注意:添加百分号不是我的用户唯一的错误,否则我只是替换任何'%'与''。
答案 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