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

