如何用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_ID | Status | Final_Status |
|---|---|---|
| 1 | Rejected | Rejected |
| 1 | Rejected | Rejected |
| 1 | Rejected | Rejected |
| 2 | Success | Success |
| 2 | Success | Success |
| 3 | Rejected | Rejected |
| 3 | Rejected | Rejected |
| 3 | Success | Rejected |
我尝试用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
相关产品推荐
相关产品推荐

