如何按条件逐行统计分组内负责人ID的累计变更次数
分组内负责人累计变更次数统计实现
需求说明
现有包含group(分组)、date(月份)、ID(负责人ID)的时间序列数据,需统计每个分组内负责人的累计变更次数,生成包含id_changes列的结果:当前行之前(含当前行)发生的负责人变更总次数,初始行变更次数为0。
输入数据
group date ID A Jan-22 1 A Feb-22 1 A Mar-22 1 A Apr-22 2 A May-22 3 A Jun-22 4 B Mar-23 6 B Apr-23 6 B May-23 3 B Jun-23 3 C Sep-21 1 C Oct-21 1 C Nov-21 4 C Dec-21 4 C Jan-22 4
期望输出
group date ID id_changes A Jan-22 1 0 A Feb-22 1 0 A Mar-22 1 0 A Apr-22 2 1 A May-22 3 2 A Jun-22 4 3 B Mar-23 6 0 B Apr-23 6 0 B May-23 3 1 B Jun-23 3 1 C Sep-21 1 0 C Oct-21 1 0 C Nov-21 4 1 C Dec-21 4 1 C Jan-22 4 1
实现方案(Python Pandas)
以下是基于Pandas的高效实现步骤:
代码示例
import pandas as pd # 加载输入数据(可替换为从文件读取,如pd.read_csv/Excel) data = pd.DataFrame({ 'group': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 'date': ['Jan-22', 'Feb-22', 'Mar-22', 'Apr-22', 'May-22', 'Jun-22', 'Mar-23', 'Apr-23', 'May-23', 'Jun-23', 'Sep-21', 'Oct-21', 'Nov-21', 'Dec-21', 'Jan-22'], 'ID': [1, 1, 1, 2, 3, 4, 6, 6, 3, 3, 1, 1, 4, 4, 4] }) # 按分组统计累计变更次数 data['id_changes'] = data.groupby('group')['ID'].apply( lambda x: (x != x.shift()).cumsum() - 1 ) # 输出格式化结果 print(data.to_string(index=False))
代码解释
groupby('group'):按分组维度独立处理,避免跨分组统计变更x != x.shift():对比当前行与上一行的ID,返回布尔值(True表示发生变更).cumsum():对变更标记做累计求和,此时初始行返回NaN,后续变更行累计值从1开始- 1:将累计值减1,使初始行变更次数为0,后续行对应实际累计变更次数
运行代码后即可得到与期望输出完全一致的结果。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

