Pandas 相当于 SQL case when 语句创建新变量

Ant*_*ano 4 python pandas

我有这个 df:

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

看起来像这样:

     a    b
    --------
0   NaN  0.0
1   2.0  0.0
2   NaN  1.0
Run Code Online (Sandbox Code Playgroud)

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

(CASE WHEN a IS NULL AND b = 0 THEN 1 ELSE 0 END) AS C
Run Code Online (Sandbox Code Playgroud)

所述期望的输出是这样的:

     a    b   c
    -----------
0   NaN  0.0  1
1   2.0  0.0  0
2   NaN  1.0  0
Run Code Online (Sandbox Code Playgroud)

我的(错误)尝试:

df['c'] = np.where(df['a']==np.nan & df['b'] == 0, 1, 0)
Run Code Online (Sandbox Code Playgroud)

许多谢谢。

小智 9

要对条件进行更多控制,请使用 np.select。与 case when 非常相似,可用于放大多个输出。

df['c'] = np.select(
[
    (df['a'].isnull() & (df['b'] == 0))
], 
[
    1
], 
default=0 )
Run Code Online (Sandbox Code Playgroud)


Zer*_*ero 5

你就快到了,而是使用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
Run Code Online (Sandbox Code Playgroud)