Pandas等价于创建新变量的SQL case when语句

2024-05-17 07:15:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据框:

data = np.array([[np.nan, 0], [2, 0], [np.nan, 1]])
df = pd.DataFrame(data=data, columns = ['a', 'b'])

看起来是这样的:

     a    b
    --------
0   NaN  0.0
1   2.0  0.0
2   NaN  1.0

我的目标是在“a”列等于NaN而“b”列等于0时创建第三列“c”,其值为1否则c“将为0。简单的SQL case语句是:

(CASE WHEN a IS NULL AND b = 0 THEN 1 ELSE 0 END) AS C

所需的输出是:

     a    b   c
    -----------
0   NaN  0.0  1
1   2.0  0.0  0
2   NaN  1.0  0

我的(错误的)尝试:

df['c'] = np.where(df['a']==np.nan & df['b'] == 0, 1, 0)

很多泰铢。


Tags: columns数据目标dataframedfsqldatanp
3条回答

我个人的偏好是将pandasapply函数与if语句一起使用:

df['c'] = df.apply(lambda x: (1 if np.isnan(x[0]) and x[1] == 0 else 0), axis=1)

你就快到了,用np.where(df['a'].isnull() & (df['b'] == 0), 1, 0)进行空检查。

或者

In [258]: df['c'] = (df['a'].isnull() & (df['b'] == 0)).astype(int)

In [259]: df
Out[259]:
     a    b  c
0  NaN  0.0  1
1  2.0  0.0  0
2  NaN  1.0  0

不能使用np.NaN检查序列值是否为NaN,而应使用series.isnull()

下面的代码给出了所需的输出:

df['c'] = np.where(df['a'].isnull() & np.array(df['b'] == 0),1,0)

相关问题 更多 >