我想创建一个列,其中几个列可以大于一,但一列必须始终为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
。