如果包含缺失值,如何创建虚拟变量?我有以下数据,我想基于几个条件创建一个虚拟变量.我的问题是,它会自动将缺少的值转换为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)

推荐答案

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

输出:

    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

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

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

Python相关问答推荐

使可滚动框架在tkinter环境中看起来自然

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

通过ManyToMany字段与Through在Django Admin中过滤

判断solve_ivp中的事件

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

交替字符串位置的正则表达式

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

如何将相同组的值添加到嵌套的Pandas Maprame的倒数第二个索引级别

如何重新组织我的Pandas DataFrame,使列名成为列值?

如何在Python中创建仅包含完整天数的月份的列表

如何关联来自两个Pandas DataFrame列的列表项?

奇怪的Base64 Python解码

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?

为什么fizzbuzz在两个数字的条件出现在一个数字的条件之后时不起作用?

如何在polars group_by中将多个行分组到列表中

使代码更快地解决哪个字母代表给定公式中的哪个数字

我应该使用哪一个来判断python中枚举值的唯一性?

有没有一种简单的方法来访问Polars struct 中的值?

捕获脚本和退出代码的多行输出

对齐多个叠置多面Seborn CAT图