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

