在 pandas DataFrame 中,我试图用一个名称重新标记变量的两个级别,但保持变量中的“Nan”值不变。
下面是使用“mtcars”数据集的修改版本的可重现示例。例如,在这里我想将“am”变量的"is"和“否”级别重新标记为"new"。
mpg cyl disp hp drat wt qsec vs am
Mazda RX4 21.0 six 160.0 110 3.90 2.620 16.46 0 yes
Mazda RX4 Wag 21.0 two 160.0 110 3.90 2.875 17.02 0 NaN
Datsun 710 22.8 six 108.0 93 3.85 2.320 18.61 1 no
Hornet 4 Drive 21.4 two 258.0 110 3.08 3.215 19.44 1 NaN
Hornet Sportabout 18.7 six 360.0 175 3.15 3.440 17.02 0 yes
Valiant 18.1 two 225.0 105 2.76 3.460 20.22 1 NaN
Duster 360 14.3 two 360.0 245 3.21 3.570 15.84 0 no
结果将如下所示:
mpg cyl disp hp drat wt qsec vs am
Mazda RX4 21.0 six 160.0 110 3.90 2.620 16.46 0 new
Mazda RX4 Wag 21.0 two 160.0 110 3.90 2.875 17.02 0 NaN
Datsun 710 22.8 six 108.0 93 3.85 2.320 18.61 1 new
Hornet 4 Drive 21.4 two 258.0 110 3.08 3.215 19.44 1 NaN
Hornet Sportabout 18.7 six 360.0 175 3.15 3.440 17.02 0 new
Valiant 18.1 two 225.0 105 2.76 3.460 20.22 1 NaN
Duster 360 14.3 two 360.0 245 3.21 3.570 15.84 0 new
最佳答案
这里有两种方法,第一个是假设非 NaN
值应使用 notnull
设置为"new" :
In [21]:
df.loc[df['am'].notnull(),'am'] = 'new'
df
Out[21]:
mpg cyl disp hp drat wt qsec vs am
Mazda RX4 21.0 six 160 110 3.90 2.620 16.46 0 new
Mazda RX4 Wag 21.0 two 160 110 3.90 2.875 17.02 0 NaN
Datsun 710 22.8 six 108 93 3.85 2.320 18.61 1 new
Hornet 4 Drive 21.4 two 258 110 3.08 3.215 19.44 1 NaN
Hornet Sportabout 18.7 six 360 175 3.15 3.440 17.02 0 new
Valiant 18.1 two 225 105 2.76 3.460 20.22 1 NaN
Duster 360 14.3 two 360 245 3.21 3.570 15.84 0 new
另一种方法是使用 isin
仅过滤那些将"is"或“否”设置为"new"的行。 :
In [23]:
df.loc[df['am'].isin(['yes','no']),'am'] = 'new'
df
Out[23]:
mpg cyl disp hp drat wt qsec vs am
Mazda RX4 21.0 six 160 110 3.90 2.620 16.46 0 new
Mazda RX4 Wag 21.0 two 160 110 3.90 2.875 17.02 0 NaN
Datsun 710 22.8 six 108 93 3.85 2.320 18.61 1 new
Hornet 4 Drive 21.4 two 258 110 3.08 3.215 19.44 1 NaN
Hornet Sportabout 18.7 six 360 175 3.15 3.440 17.02 0 new
Valiant 18.1 two 225 105 2.76 3.460 20.22 1 NaN
Duster 360 14.3 two 360 245 3.21 3.570 15.84 0 new
关于python - 重新标记 pandas 中的级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121803/