如何用Pandas/NumPy在DataFrame中按contactid分组生成规则新列
Pandas 实现方案
实现步骤如下:
- 先将每个contactid对应的各类型奖金领取状态转为宽表,方便统一判断
- 按规则为每个contactid匹配对应的NEW_COLUMN值
- 将结果映射回原DataFrame完成新增列操作
可直接运行的完整代码:
import pandas as pd import numpy as np # 构造示例DataFrame,你可以替换为你自己的数据源 df = pd.DataFrame({ 'contactid': [100, 100, 200, 200, 200], 'bonustype': ['a', 'b', 'a', 'b', 'c'], 'bonusreceived': ['yes', 'no', 'no', 'yes', 'yes'] }) # 1. 汇总每个contactid的各奖金类型领取状态 bonus_status = df.pivot_table( index='contactid', columns='bonustype', values='bonusreceived', aggfunc='first' ).fillna('no') # 2. 按规则生成每个contactid对应的新列值 def calc_new_col(row): # 先判断a、b、c三类奖金均领取的情况 if row.get('a', 'no') == 'yes' and row.get('b', 'no') == 'yes' and row.get('c', 'no') == 'yes': return 'abc' # 再判断仅a、b两类奖金均领取的情况 elif row.get('a', 'no') == 'yes' and row.get('b', 'no') == 'yes': return 'ab' # 其余情况返回空值 else: return np.nan bonus_status['NEW_COLUMN'] = bonus_status.apply(calc_new_col, axis=1) # 3. 将结果映射回原DataFrame df = df.merge(bonus_status[['NEW_COLUMN']], on='contactid', how='left') # 若需要空值显示为字符串'NULL',可加上以下代码 # df['NEW_COLUMN'] = df['NEW_COLUMN'].fillna('NULL') print(df)
运行后得到的结果严格符合你给出的规则要求,若你提供的样例中部分取值和规则冲突,可自行调整判断分支的逻辑顺序即可。
内容的提问来源于stack exchange,提问作者user17066146
相关产品推荐
相关产品推荐

