如何对周期性数据按组用cumsum/cumcount实现循环计数重置?
解决Pandas中按ID和连续状态周期重置计数的问题
要实现每个ID下连续相同SWITCH状态的周期内计数重置,核心是先识别每个ID内的状态变化边界,生成独立的周期分组,再在每个周期内进行计数。
具体实现步骤:
- 按
ID分组,标记每个分组内SWITCH状态发生变化的行 - 对状态变化标记做累加,得到每个连续状态周期的唯一标识
- 按
ID和周期标识分组,使用cumcount()生成周期内的递增计数(加1让计数从1开始)
代码示例:
假设你的DataFrame名为df,执行以下代码:
import pandas as pd # 生成状态变化标记:当前行与上一行SWITCH不同则为True,否则False df['状态变化'] = df.groupby('ID')['SWITCH'].diff() != 0 # 累加状态变化标记,得到每个连续状态的周期编号(同一周期内编号相同) df['周期编号'] = df.groupby('ID')['状态变化'].cumsum().fillna(0).astype(int) # 按ID和周期编号分组,生成周期内计数 df['周期内计数'] = df.groupby(['ID', '周期编号']).cumcount() + 1 # 可删除中间辅助列,保留目标结果 df = df.drop(['状态变化', '周期编号'], axis=1)
关键逻辑说明:
groupby('ID')['SWITCH'].diff():计算每个ID内当前行与上一行的SWITCH差值,不同状态时返回非0值,相同则为0cumsum():对状态变化标记累加,每遇到一次状态变化,周期编号就加1,确保同一连续状态的行拥有相同的周期编号cumcount() +1:在每个ID+周期编号的分组内生成从0开始的计数,加1后转为从1开始的递增序列
内容的提问来源于stack exchange,提问作者Whiskey Mental Disturb
相关产品推荐
相关产品推荐

