Pandas如何按客户ID分组判断状态列值并生成对应新列
Pandas 按客户分组标记状态实现方案
需求说明:针对每个客户,只要其任意一条记录的Status为Confirmed,该客户所有行的新增列Customer Status都标记为Active,否则标记为Inactive。
最简实现代码
不需要写循环、不需要额外做表关联,直接用pandas内置的分组变换方法即可实现:
# 直接在原DataFrame上新增列即可 df['Customer Status'] = df.groupby('Customer ID')['Status'].transform( lambda group: 'Active' if group.eq('Confirmed').any() else 'Inactive' )
逻辑解释
- 首先以
Customer ID为维度做分组,每个分组对应同一个客户的全部记录 - 对每个分组的
Status列做存在性判断:eq('Confirmed').any()会返回布尔值,表示组内是否存在状态为Confirmed的记录 transform方法会把每个分组计算得到的单值结果,自动广播填充到组内的每一行,保证同一个客户的所有行标记完全一致- 执行完上述代码后,输出结果和预期完全一致,不会改动原有两列的数值和顺序
可选等价实现
如果习惯先算映射表再赋值的写法,也可以用下面的代码,逻辑完全一致,超大数据集下性能表现相近:
# 先计算每个客户ID对应的状态 status_mapping = ( df['Status'].eq('Confirmed') .groupby(df['Customer ID']) .any() .replace({True: 'Active', False: 'Inactive'}) ) # 按客户ID映射赋值到新列 df['Customer Status'] = df['Customer ID'].map(status_mapping)
内容的提问来源于stack exchange,提问作者Rachel Soh
相关产品推荐
相关产品推荐

