保持一列不变,但创建所有其他列都有值(使用OR)panda的情况



我想创建一个列,其中几个列可以大于一,但一列必须始终为0,例如:

df['indicator'] = np.where(( (df['01'] > 0) | (df['02']> 0)  | (df['03']> 0) | (df['04']> 0) 
& (df['spend'] == 0 )), 1, 0)

我想根据如果01到04列中的任何一列大于0,则1是否大于0来创建此标志。但是,尽管这些中的每一个都>0支出列在任何情况下都必须保持为0。这意味着如果01和02是>0则支出必须为0等。

然而,使用上述逻辑,我最终得到支出>0-我缺少什么?

就个人而言,当在数据帧中处理多个条件时,我使用masks:stackoverflow post about masks

col_1_idx = df['01'] > 0
col_2_idx = df['02'] > 0
col_3_idx = df['03'] > 0
col_4_idx = df['04'] > 0
or_col_idx = col_1_idx | col_2_idx | col_3_idx | col_4_idx
spend_idx = df['spend'] == 0
df['indicator'] = np.where(df[or_col_idx & spend_idx]), 1, 0)

IIUC,这可以简化为:

df['indicator'] = (df[['01','02','03','04']].gt(0).any(axis=1) & df['spend'].eq(0)).astype(int)

我经常使用.gt(), .lt(), .eq(), .le()等来简化我们遇到的这些()

当您想要的输出本质上是一个数字布尔值时,您真的不需要np.where

相关内容

最新更新