如何在Pandas中按id分组筛选连续周的行数据
按ID保留连续周数据的实现方案
步骤说明
- 先把
week列的周数提取为整数,方便计算连续性 - 按
id分组后,通过相邻周数的差值标记连续的分组 - 筛选出包含至少2条连续记录的分组,保留这些行
完整代码
import pandas as pd # 构建原始数据 df = pd.DataFrame({ 'id': [1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3], 'week': ['2022-W9','2022-W10', '2022-W11', '2022-W15', '2022-W17', '2022-W10','2022-W11', '2022-W15', '2022-W19', '2022-W24', '2022-W1','2022-W3', '2022-W19', '2022-W20', '2022-W42'] }) # 1. 提取周数的数值部分,转为整数 df['week_num'] = df['week'].str.extract(r'W(\d+)').astype(int) # 2. 按id分组,标记连续周的分组 df['group'] = df.groupby('id')['week_num'].diff().ne(1).cumsum() # 3. 统计每个(id, group)组合的行数,筛选出行数≥2的组 group_counts = df.groupby(['id', 'group']).size().reset_index(name='count') valid_groups = group_counts[group_counts['count'] >= 2][['id', 'group']] # 4. 合并回原数据,保留符合条件的行 result = df.merge(valid_groups, on=['id', 'group']).drop(columns=['week_num', 'group']) print(result)
代码解释
- 提取周数:用正则表达式
r'W(\d+)'提取week列中W后面的数字,转成整数后存入week_num列,方便后续计算差值。 - 标记连续分组:通过
groupby('id')['week_num'].diff()计算相邻周数的差值,当差值不等于1时说明是新的连续组起点,用cumsum()生成分组编号。 - 筛选有效分组:统计每个
(id, group)的行数,只保留行数≥2的分组(因为连续至少需要2个周)。 - 合并得到结果:将有效分组和原数据合并,去掉辅助列后得到最终结果。
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

