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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:16:17