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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:03:22