如何按唯一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
相关产品推荐
相关产品推荐

