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

如何按唯一ID统计DataFrame中0→1的事件变化并生成新列

解决方案

可以用Pandas的分组、移位和累计求和逻辑实现需求,具体操作如下:

1. 先构造示例数据(对应你提供的样例)

import pandas as pd

data = {
    'Id': [1]*10 + [2]*11 + [3]*9,
    'Period': ['Jan-21','Feb-21','Mar-21','Apr-21','May-21','Jun-21','Jul-21','Aug-21','Sep-21','Oct-21',
               'Jan-21','Feb-21','Mar-21','Apr-21','May-21','Jun-21','Jul-21','Jun-21','Jul-21','Aug-21','Sep-21',
               'Jan-21','Feb-21','Mar-21','Apr-21','May-21','Jun-21','Jul-21','Aug-21','Sep-21'],
    'Col1': [0,1,0,0,1,0,1,1,0,1,
             1,1,0,1,0,1,0,0,1,0,0,
             1,1,0,1,0,0,0,1,0],
    'col2(Out)': [0,1,1,1,2,2,3,3,3,4,
                  0,0,0,1,1,2,2,2,3,3,3,
                  0,0,0,1,1,1,1,2,2]
}

df = pd.DataFrame(data)

2. 检测0→1的状态切换

按Id分组后,取每组内前一行的Col1值,标记出"前一行是0且当前行是1"的触发行:

# 生成每组内前一行的Col1值
df['prev_col1'] = df.groupby('Id')['Col1'].shift(1)
# 标记符合0→1切换的行,符合为1,否则为0
df['switch_flag'] = ((df['Col1'] == 1) & (df['prev_col1'] == 0)).astype(int)

3. 计算累计计数得到col2

对每组内的标记列做累计求和,就能得到你要的递增值:

df['col2'] = df.groupby('Id')['switch_flag'].cumsum()

4. 简化版代码(无需中间列)

如果不想保留中间的prev_col1和switch_flag,可以直接合并成一行:

df['col2'] = df.groupby('Id')['Col1'].apply(
    lambda x: ((x == 1) & (x.shift(1) == 0)).cumsum()
)

运行后生成的col2列会和你提供的col2(Out)完全一致,满足每个Id下仅在Col1从0变为1时递增计数,后续行保持该值直到下一次切换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:40:16