将多行的值更改为NaN的问题

问题描述

我有这个DataFrame:

test = database[['WEATHER']]

enter image description here

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

错误不断出现:

enter image description here

我一直在试图纠正它,但是我没有找到解决方法

解决方法

通常,您要避免迭代大熊猫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.anp.nan

,

您的堆栈跟踪包含 KeyError:15 ,因此您可能尝试 仅使用 15 检索键==的行,但您的DataFrame不包含 这样的钥匙。

现在介绍如何正确有效地完成任务。 在有问题的列上使用 mask ,并使用 inplace

df.WEATHER.mask(df.WEATHER.str.lower().isin(['other','unknown']),np.nan,inplace=True)

无论字母大小写如何(例如 other OTHER ),我将原始值转换为小写,然后与 “禁止”列表。