如何在Pandas中按ID分组后对每组内每n行求均值并统计行数?
问题描述
我有一个包含多列的大型DataFrame,其中一列是字符串类型的ID,其余列均为浮点类型。示例DataFrame如下:
import pandas as pd df = pd.DataFrame({'ID': ['Child', 'Child', 'Child', 'Child', 'Baby', 'Baby', 'Baby', 'Baby'], 'income': [40000, 50000, 42000, 300, 2000, 4000, 2000, 3000], 'Height': [1.3, 1.5, 1.9, 2.0, 2.3, 1.4, 0.9, 0.8]})
需求是:先按ID分组,再对每组内的所有列,每n行计算一次均值,同时统计每个均值对应的参与计算的行数(新增Values列)。期望输出(当steps=3时)如下:
df_result = pd.DataFrame({'ID': ['Child', 'Child', 'Baby', 'Baby'], 'income': [44000, 300, 2600 , 3000], 'Height': [1.567, 2.0, 1.533, 0.8], 'Values': [3, 1, 3, 1]})
解决方案
可以通过分组后添加分组内的行号分箱来实现,具体步骤如下:
- 按
ID分组,为每组内的行生成连续序号,再用序号计算分箱标签(每n行一组) - 按
ID和分箱标签二次分组,计算数值列的均值以及每组的行数 - 整理结果格式,匹配期望输出
完整代码示例
import pandas as pd # 初始化数据 df = pd.DataFrame({'ID': ['Child', 'Child', 'Child', 'Child', 'Baby', 'Baby', 'Baby', 'Baby'], 'income': [40000, 50000, 42000, 300, 2000, 4000, 2000, 3000], 'Height': [1.3, 1.5, 1.9, 2.0, 2.3, 1.4, 0.9, 0.8]}) steps = 3 # 为每组添加行号,并生成分箱组 df['group_num'] = df.groupby('ID').cumcount() // steps # 按ID和分箱组计算均值与行数 result = df.groupby(['ID', 'group_num']).agg( income=('income', 'mean'), Height=('Height', 'mean'), Values=('ID', 'count') ).reset_index() # 调整格式匹配示例输出 result = result.drop('group_num', axis=1) result['Height'] = result['Height'].round(3) result['income'] = result['income'].astype(int) print(result)
代码说明
df.groupby('ID').cumcount():为每个ID分组内的行生成从0开始的连续序号// steps:通过整数除法将序号按每steps行划分为一个组,比如序号0、1、2会被分到组0,序号3分到组1groupby(['ID', 'group_num']).agg(...):同时计算数值列的均值,并用count统计每组的行数- 最后通过
round和astype调整格式,与示例输出对齐
内容的提问来源于stack exchange,提问作者Dhuijsman
相关产品推荐
相关产品推荐

