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

如何用Pandas生成Final_Status列:客户含拒绝则全标拒绝

在Pandas中为大型数据集生成Final_Status列的解决方案

问题描述

我有一个包含Customer_id和Status列的大型数据集,需要生成Final_Status列,规则如下:

  • 同一Customer_id只要有一行Status为Rejected,该客户所有行的Final_Status均设为Rejected
  • 若同一Customer_id的所有Status都是Success,则Final_Status全为Success

示例数据:

Customer_IDStatusFinal_Status
1RejectedRejected
1RejectedRejected
1RejectedRejected
2SuccessSuccess
2SuccessSuccess
3RejectedRejected
3RejectedRejected
3SuccessRejected

我尝试用Pandas的shift()函数处理,但出现错误,比如Customer ID 2被错误标记为Rejected。


正确实现方法

不需要使用shift(),通过groupby结合transform可以高效解决这个问题,且适配大型数据集:

import pandas as pd

# 假设数据集存储在df变量中
df['Final_Status'] = df.groupby('Customer_ID')['Status'].transform(
    lambda x: 'Rejected' if (x == 'Rejected').any() else 'Success'
)

代码解释

  • groupby('Customer_ID'):按客户ID分组,将同一客户的所有行归为一组
  • transform():对每个分组执行逻辑判断后,将结果映射回原数据集的每一行,保证行数与原数据一致
  • (x == 'Rejected').any():检查当前分组内是否存在至少一条Rejected记录,满足则返回Rejected,否则返回Success

超大型数据集优化方案

如果数据集规模达到千万级以上,可改用更节省内存的向量化操作:

# 先预计算每个客户是否存在Rejected记录
customer_status = df.groupby('Customer_ID')['Status'].apply(lambda x: (x == 'Rejected').any())
# 将结果映射回原数据集
df['Final_Status'] = df['Customer_ID'].map(customer_status).replace({True: 'Rejected', False: 'Success'})

这种方式先一次性计算所有客户的状态标记,再通过map快速映射,避免了逐组遍历的额外开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:07:07