Pandas - 如果特定列的值为 1,则将行中的其他列替换为 0

mad*_*aks 5 python pandas

这是一个示例数据框:

X Y Z 
1 0 1
0 1 0
1 1 1
Run Code Online (Sandbox Code Playgroud)

现在,这是我提出的规则:

  • X 保持原样
  • 如果 Y 等于 1,则将 X 中的相应值设置为 0
  • 如果 Z 等于 1,则将 X 和 Y 中的相应值设置为 0

最终的数据框应如下所示:

X Y Z 
0 0 1
0 1 0
0 0 1
Run Code Online (Sandbox Code Playgroud)

我对解决方案的第一个想法是:

df_null_list = ['X']

for i in ['Y', 'Z']:

    df[df[i] == 1][df_null_list] = 0

    df_null_list.append(i)
Run Code Online (Sandbox Code Playgroud)

当我这样做并在 y 轴上求和时,我开始得到 2 和 4 的值,这是没有意义的。注意,我指的是我在实际数据集上运行它的时候。

您有任何改进建议或替代解决方案吗?

jez*_*ael 5

使用mask

df['X'] = df['X'].mask(df.Y == 1, 0)
df[['X', 'Y']] = df[['X', 'Y']].mask(df.Z == 1, 0)
Run Code Online (Sandbox Code Playgroud)

另一个解决方案DataFrame.loc

df.loc[df.Y == 1, 'X'] = 0
df.loc[df.Z == 1, ['X', 'Y']] = 0

print (df)
   X  Y  Z
0  0  0  1
1  0  1  0
2  0  0  1
Run Code Online (Sandbox Code Playgroud)