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

pandas按多字段分组后如何筛选指定年份区间元素并统计id数量

实现代码

你可以直接使用groupby配合自定义逻辑完成统计,以下是两种可直接运行的实现方案:

写法1:直观易读(适合小数据量)

import pandas as pd

# 构建示例DataFrame
df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                   'x': ['A', 'A', 'A', 'A', 'C', 'C','E', 'G', 'G', 'G'],
                   'y': ['B', 'B', 'B', 'B', 'D', 'D', 'F', 'H', 'H', 'H'],
                   'year': [1990, 1991, 1992, 1993, 1994, 1999, 1999, 2001, 2002, 2010]})

# 核心统计逻辑
result = df.groupby(['x', 'y']).apply(
    lambda group: group[group['year'].between(group['year'].min(), group['year'].min() + 4)]['id'].count()
).reset_index(name='count_id')

print(result)

写法2:性能优化(适合大数据量)

用transform提前生成分组最小年份,避免逐组循环的性能损耗:

# 先给每行标记所属分组的最小年份
df['group_min_year'] = df.groupby(['x', 'y'])['year'].transform('min')
# 筛选符合条件的行后分组统计
result = df[df['year'].between(df['group_min_year'], df['group_min_year'] + 4)]\
    .groupby(['x', 'y'], as_index=False)['id'].count()\
    .rename(columns={'id': 'count_id'})

输出结果

两种写法都会得到你需要的预期结果:

x  y  count_id
0  A  B         4
1  C  D         1
2  E  F         1
3  G  H         2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:42:04