问题描述
我有这个DataFrame:
test = database[['WEATHER']]
WEATHER的某些值是“ UnkNown”和“ Other”,它们的价值不高,因此我想将其更改为NaN。因此,我尝试以下代码:
for i in range(len(test)):
if test['WEATHER'][i] == "Other" or test['WEATHER'][i] == "UnkNown":
test['WEATHER'][i] = np.nan
此错误不断出现:
我一直在试图纠正它,但是我没有找到解决方法。
解决方法
通常,您要避免迭代大熊猫DataFrame
。这是我的处理方式:
>>> df.a
0 Other
1 Unknown
2 BLAH
Name: a,dtype: object
>>> df.a = np.choose(df.a.isin(['Other','Unknown']),[df.a,np.nan])
>>> df.a
0 NaN
1 NaN
2 BLAH
Name: a,dtype: object
isin()
检查每个值是否在预定义的列表['Other','Unknown']
中,并且np.choose()
根据对isin()
的布尔运算结果来确定一个值。结果是原始值df.a
或np.nan
。
您的堆栈跟踪包含 KeyError:15 ,因此您可能尝试 仅使用 15 检索键==的行,但您的DataFrame不包含 这样的钥匙。
现在介绍如何正确有效地完成任务。 在有问题的列上使用 mask ,并使用 inplace :
df.WEATHER.mask(df.WEATHER.str.lower().isin(['other','unknown']),np.nan,inplace=True)
无论字母大小写如何(例如 other 或 OTHER ),我将原始值转换为小写,然后与 “禁止”列表。