Python中如何按组基于Status字段变化创建Completer变量
按分组标记完成状态后的记录
初始数据
import pandas as pd df = {'Date': ["2011-10-19", "2013-01-14", "2014-05-27", "2014-06-23", "2014-08-12", "2014-09-22", "2014-09-22", "2014-09-22" ], 'Status': ["Pending", "Pending", "Complete", "Pending", "Complete", "Pending", "Pending", "Pending"], 'Group': ["a", "a", "a", "a", "b", "b", "b", "b"]} df = pd.DataFrame(data=df) df
需求说明
按Group字段分组,根据Status随时间的变化创建新字段Completer:
- 当某组内出现第一条
Status为"Complete"的记录后,该组后续所有记录标记为"Completer" - 第一条"Complete"记录及之前的所有记录标记为"Non-Completer"
期望结果
df2 = {'Date': ["2011-10-19", "2013-01-14", "2014-05-27", "2014-06-23", "2014-08-12", "2014-09-22", "2014-09-22", "2014-09-22" ], 'Status': ["Pending", "Pending", "Complete", "Pending", "Complete", "Pending", "Pending", "Pending"], 'Group': ["a", "a", "a", "a", "b", "b", "b", "b"], 'Completer': ["Non-Completer", "Non-Completer", "Non-Completer", "Completer", "Non-Completer", "Completer", "Completer", "Completer"]} df2 = pd.DataFrame(data=df2) df2
解决方案
核心思路:先确保数据按分组和时间排序,再分组定位每组第一条"Complete"记录的位置,最后根据位置标记目标标签。
基础版本(假设每组至少有一条"Complete"记录)
# 1. 按Group和Date排序,保证时间顺序正确 df = df.sort_values(['Group', 'Date']).reset_index(drop=True) # 2. 分组计算并标记 df['Completer'] = df.groupby('Group').apply( lambda x: x.index > x[x['Status'] == 'Complete'].index[0] ).explode().map({True: 'Completer', False: 'Non-Completer'}) print(df)
健壮版本(兼容无"Complete"记录的分组)
如果存在某组没有任何"Complete"记录的情况,用以下代码避免报错:
def mark_completer(group): complete_indices = group[group['Status'] == 'Complete'].index # 分组无Complete记录时,全标记为Non-Completer if len(complete_indices) == 0: return ['Non-Completer'] * len(group) first_complete_idx = complete_indices[0] # 按位置判断并生成标签 return ['Completer' if idx > first_complete_idx else 'Non-Completer' for idx in group.index] # 先排序再分组处理 df = df.sort_values(['Group', 'Date']).reset_index(drop=True) df['Completer'] = df.groupby('Group', group_keys=False).apply(mark_completer) print(df)
内容的提问来源于stack exchange,提问作者Kreitz Gigs
相关产品推荐
相关产品推荐

