如何使用Pandas GroupBy结合Grade与Height分桶计算DataFrame均值?
问题描述
现有如下格式的DataFrame df:
Grade Height Speed Value 0 A 13 0.1 500 1 B 25 0.3 100 2 C 54 0.6 200
需求是:以Grade为索引,将Height划分为指定区间(0-10、10-25、25-50、50-100)作为列,每个单元格计算对应Grade与Height区间组合下Speed*Value的均值,预期输出格式如下:
Height Grade 0-10 10-25 25-50 50-100 A avg(speed*value) x x x B x x x x C x x x x
尝试的代码未成功:
output = pd.DataFrame(data=df, index = df[df['Grade']], columns = df[df['Height']].groupby(pd.qcut(df['Height'], 3, duplicates='drop'))).groupby(df['Value')).mean()
该代码要么报错要么返回空DataFrame,求可行解决方法。
可行解决方法
步骤1:计算Speed*Value乘积列
先新增一列存储Speed和Value的乘积,简化后续均值计算:
df['Speed_Value'] = df['Speed'] * df['Value']
步骤2:自定义Height区间
根据需求设置固定区间(而非按分位数划分的qcut),并给每个区间命名:
bins = [0, 10, 25, 50, 100] labels = ['0-10', '10-25', '25-50', '50-100'] # right=False 表示区间左闭右开,例如10-25包含10但不包含25,可根据需求调整 df['Height_Interval'] = pd.cut(df['Height'], bins=bins, labels=labels, right=False)
步骤3:用透视表生成目标格式
使用pivot_table直接实现分组聚合,指定索引、列、聚合字段和函数:
output = df.pivot_table(index='Grade', columns='Height_Interval', values='Speed_Value', aggfunc='mean')
完整代码示例
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Grade': ['A', 'B', 'C'], 'Height': [13, 25, 54], 'Speed': [0.1, 0.3, 0.6], 'Value': [500, 100, 200] }) # 计算Speed*Value乘积 df['Speed_Value'] = df['Speed'] * df['Value'] # 划分Height区间 bins = [0, 10, 25, 50, 100] labels = ['0-10', '10-25', '25-50', '50-100'] df['Height_Interval'] = pd.cut(df['Height'], bins=bins, labels=labels, right=False) # 生成目标透视表 output = df.pivot_table(index='Grade', columns='Height_Interval', values='Speed_Value', aggfunc='mean') # 可选:将NaN替换为示例中的x output = output.fillna('x') print(output)
输出结果
Height_Interval 0-10 10-25 25-50 50-100 Grade A x 50.0 x x B x x 30.0 x C x x x 120.0
原代码问题分析
- 索引和列的定义逻辑错误:
df[df['Grade']]是布尔索引,不能直接作为DataFrame索引;列的构造部分完全不符合分组逻辑; - 分组依据错误:最后按
Value分组与需求无关,需求是按Grade和Height区间组合聚合。
内容的提问来源于stack exchange,提问作者SWA
相关产品推荐
相关产品推荐

