如何在Python中含缺失值时创建虚拟变量并保留缺失值
保留缺失值的虚拟变量创建方法
问题出在astype(int)上——普通整数类型没法存储缺失值,所以pandas会把布尔运算产生的NaN强制转成0。要保留缺失值,有两种简单的解决方法:
方法一:使用pandas可空整数类型Int64
直接将结果转为大写I的Int64类型,它支持存储整数和NaN:
import pandas as pd import numpy as np mydata = {'x' : [10, 50, np.nan, 32, 47, np.nan, 20, 5, 100, 62], 'y' : [10, 1, 5, np.nan, 47, np.nan, 8, 5, 100, 3]} df = pd.DataFrame(mydata) # 用Int64类型保留缺失值 df["z"] = ((df["x"] >= 50) & (df["y"] <= 20)).astype('Int64') print(df)
运行后z列会保留原数据中的缺失值:当x或y为NaN时,z对应位置也是NaN;满足条件的为1,不满足的为0。
方法二:用np.where显式处理缺失值
如果需要得到float类型的结果,也可以用np.where判断是否为缺失值,再赋值:
import pandas as pd import numpy as np mydata = {'x' : [10, 50, np.nan, 32, 47, np.nan, 20, 5, 100, 62], 'y' : [10, 1, 5, np.nan, 47, np.nan, 8, 5, 100, 3]} df = pd.DataFrame(mydata) condition = (df["x"] >= 50) & (df["y"] <= 20) # 当条件不为NaN时转成整数,否则保留NaN df["z"] = np.where(condition.notna(), condition.astype(int), np.nan) print(df)
原理说明
当x或y是NaN时,df["x"] >= 50或df["y"] <= 20的运算结果为NaN,布尔与运算后结果还是NaN。普通int类型无法存储NaN,所以astype(int)会自动将NaN转为0;而Int64是pandas专门设计的可空整数类型,能够同时存储整数和缺失值,因此可以保留原始的NaN状态。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

