You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:24:03