如何按Name列分组计算多列所有数值的平均值?
问题说明
原始数据表格:
| Name | score1 | score2 | score3 |
|---|---|---|---|
| Bob | 100 | 120 | 900 |
| Lisa | 40 | 120 | 90 |
| Bob | 590 | 490 | 80 |
| Tim | 100 | 120 | 900 |
| Tim | 40 | 120 | 90 |
| Bob | 590 | 490 | 80 |
需求:按Name列的不同人员分组,计算该人员所有行内score1、score2、score3全部数值的平均值。比如Bob有3行数据,共9个数值,要计算这9个值的整体平均值,而非每行平均值再求平均。
已知以下代码用于计算每行多列的平均值:
df['averages'] = df[['Score1', 'Score2', 'Score3']].mean(axis=1)
修改方案
要实现按姓名分组的整体平均值计算,可采用以下两种简洁方法:
方法一:堆叠列后计算分组平均
# 按Name分组,将每组的score列堆叠为一维序列,再按Name层级求平均 grouped_overall_avg = df.groupby('Name')[['score1', 'score2', 'score3']].stack().mean(level=0)
逻辑:stack()会把每组的三列score数据平铺成一列,此时每组所有score值都在同一个序列里,mean(level=0)指定按原分组的Name维度计算平均,直接得到每个人员所有score数值的整体平均值。
方法二:总和除以总数值个数
# 先算每组所有score的总和,再除以该组的总数值数量(行数×3) grouped_overall_avg = df.groupby('Name')[['score1', 'score2', 'score3']].sum().sum(axis=1) / (df.groupby('Name').size() * 3)
逻辑:先按Name分组,计算每组各score列的和,再对这些和求和得到该人员的总分数;df.groupby('Name').size()得到每组的行数,乘以3就是该人员的总数值个数,总分数除以总个数即为整体平均值。
合并回原表格(可选)
如果需要把计算出的整体平均值添加到原DataFrame的对应行,可用map:
df['overall_average'] = df['Name'].map(grouped_overall_avg)
内容的提问来源于stack exchange,提问作者EvitaSchaap
相关产品推荐
相关产品推荐

