如果包含缺失值,如何在 Python 中创建虚拟变量?

Lis*_*isa 5 python nan missing-data dummy-variable

如果包含缺失值,如何创建虚拟变量?我有以下数据,我想根据几个条件创建一个虚拟变量。我的问题是它会自动将我的缺失值转换为 0,但我想将它们保留为缺失值。

import pandas as pd

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)

df["z"] = ((df["x"] >= 50) & (df["y"] <= 20)).astype(int)

print(df)
Run Code Online (Sandbox Code Playgroud)

ko3*_*ko3 5

创建布尔掩码时,您正在将整数与nans. 在您的情况下,df['x']=np.nan与 50 进行比较时,如果您将其转换为整数,您的掩码df['x'] >= 50将始终False等于。0您只需创建一个布尔掩码,该掩码等于包含列中的True所有行,然后分配给这些行。np.nan['x', 'y']np.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)

df["z"] = ((df["x"] >= 50) & (df["y"] <= 20)).astype("uint32")
df.loc[df[["x", "y"]].isna().any(axis=1), "z"] = np.nan
Run Code Online (Sandbox Code Playgroud)

输出:

    x       y       z
0   10.0    10.0    0.0
1   50.0    1.0     1.0
2   NaN     5.0     NaN
3   32.0    NaN     NaN
4   47.0    47.0    0.0
5   NaN     NaN     NaN
6   20.0    8.0     0.0
7   5.0     5.0     0.0
8   100.0   100.0   0.0
9   62.0    3.0     1.0
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要单行语句,则可以使用嵌套np.where语句:

df["z"] = np.where(
    df.isnull().any(axis=1), np.nan, np.where((df["x"] >= 50) & (df["y"] <= 20), 1, 0)
)
Run Code Online (Sandbox Code Playgroud)