如何在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
相关产品推荐
相关产品推荐

