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

如何在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]})
解决方案

可以通过分组后添加分组内的行号分箱来实现,具体步骤如下:

  1. 按ID分组,为每组内的行生成连续序号,再用序号计算分箱标签(每n行一组)
  2. 按ID和分箱标签二次分组,计算数值列的均值以及每组的行数
  3. 整理结果格式,匹配期望输出

完整代码示例

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分到组1
  • groupby(['ID', 'group_num']).agg(...):同时计算数值列的均值,并用count统计每组的行数
  • 最后通过round和astype调整格式,与示例输出对齐

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:45:48