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

如何在Pandas中按user_id合并DataFrame行并按规则生成状态

按user_id合并行并自定义状态逻辑

嘿,这个需求我经常遇到,用Pandas处理起来超顺手!咱们一步步来实现你要的效果:

1. 先明确核心逻辑

咱们的目标很清晰:

  • 按user_id对数据分组
  • 只要组内至少有一条请求状态是APPROVED或CONTRACTED,合并后的状态就设为APPROVED
  • 若组内没有这两种状态,合并后的状态统一设为DISAPPROVED

2. 完整示例代码实现

我给你准备了包含测试数据、自定义逻辑和结果输出的完整代码,你可以直接参考:

import pandas as pd

# 构造模拟的用户请求数据(和你的实际数据结构一致即可)
data = {
    'user_id': [1, 1, 2, 3, 3, 3],
    'status': ['PENDING', 'APPROVED', 'DISAPPROVED', 'PENDING', 'REJECTED', 'CONTRACTED'],
    'request_info': ['申请会员', '会员审核通过', '申请被驳回', '申请消费贷', '贷款审核失败', '贷款签约完成']
}
df = pd.DataFrame(data)

# 自定义聚合函数:判断分组内的状态是否符合条件
def get_final_status(status_group):
    # 检查分组中是否存在目标状态
    if status_group.isin(['APPROVED', 'CONTRACTED']).any():
        return 'APPROVED'
    else:
        return 'DISAPPROVED'

# 执行分组合并操作
merged_df = df.groupby('user_id').agg(
    final_status=('status', get_final_status),
    # 其他列可根据需求选择聚合方式:比如合并所有请求信息,或取第一条/最后一条
    combined_requests=('request_info', '; '.join)
).reset_index()

print(merged_df)

3. 运行结果展示

执行上述代码后,你会得到符合预期的合并结果:

user_id final_status                combined_requests
0        1     APPROVED        申请会员; 会员审核通过
1        2  DISAPPROVED                申请被驳回
2        3     APPROVED  申请消费贷; 贷款审核失败; 贷款签约完成

4. 简化版(仅保留user_id和状态)

如果你的需求只需要合并后的user_id和状态字段,不需要其他附属信息,可以用更简洁的写法:

merged_df = df.groupby('user_id')['status'].apply(
    lambda x: 'APPROVED' if x.isin(['APPROVED', 'CONTRACTED']).any() else 'DISAPPROVED'
).reset_index(name='final_status')

这个逻辑完全贴合你的需求:只要用户有过一次APPROVED或CONTRACTED记录,就标记为通过,否则统一标记为未通过。如果需要处理空值或其他特殊状态,直接在自定义函数里加判断即可!

内容的提问来源于stack exchange,提问作者Alexandre Lara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:12:45