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

如何按year_group顺序统计id对应的category类别转移次数

实现思路

不需要拆分多个DataFrame,用分组+移位的方法就能天然保证时间顺序,完全避免反向统计的问题,核心逻辑如下:

  • 先按id+year_group升序排序,确保每个id下的行是按年份从小到大排列
  • 对每个id的category列用shift(-1)取后一行的类别值,自动对应「当前年份→下一年份」的先后关系,天然不会出现反向统计的情况
  • 过滤掉没有下一年数据的行(每个id最大年份的行移位后为空值),再筛选出当前类别和下一年类别不同的记录,就是你要的有效转移
  • 最后对转移的前后类别组合计数即可
具体代码实现
import pandas as pd

# 第一步:按id+年份升序排序,保证时间顺序正确
df = df.sort_values(by=['id', 'year_group']).reset_index(drop=True)

# 第二步:分组取每个id下一年的类别,同时标注转移的年份区间
df['next_category'] = df.groupby('id')['category'].shift(-1)
df['transfer_range'] = df['year_group'].astype(str) + '→' + (df['year_group']+1).astype(str)

# 第三步:筛选有效转移:有下一年数据、类别发生变化、年份区间在要求范围内
valid_transfer = df[
    df['next_category'].notna()
    & (df['category'] != df['next_category'])
    & df['transfer_range'].isin(['1→2', '2→3'])
]

# 第四步:统计转移次数,如果不需要区分年份区间,去掉groupby里的transfer_range即可
transfer_count = valid_transfer.groupby(['transfer_range', 'category', 'next_category']).size().reset_index(name='count')
结果说明

最终得到的transfer_count表会清晰展示每个年份区间下,不同类别转移的发生次数,你示例中的id=8300会被统计为1→2区间low→medium计数+1,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:36:06