pandas 数据透视表:通过 aggfunc 计算加权平均值

Posted

技术标签:

【中文标题】pandas 数据透视表:通过 aggfunc 计算加权平均值【英文标题】:pandas pivot table: calculate weighted averages through aggfunc 【发布时间】:2021-01-07 16:36:15 【问题描述】:

我有一个关于教育和收入的 pandas 数据框,基本上看起来像这样。

import pandas as pd
import numpy as np

data = 
    'education': ['Low', 'High', 'High', 'Medium', 'Low', 'Low', 'High', 'Low', 'Medium', 'Medium'],
    'income': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'weights': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

    
df = pd.DataFrame(data, columns=['education', 'income', 'weights'])

print(df)
  education  income  weights
0       Low       1       11
1      High       2       12
2      High       3       13
3    Medium       4       14
4       Low       5       15
5       Low       6       16
6      High       7       17
7       Low       8       18
8    Medium       9       19
9    Medium      10       20

我创建了一个数据透视表,用于计算每个教育类别的平均收入,如下所示:

pivot_educ_inc = pd.pivot_table(df, 
                                values='income',
                                index='education',
                                aggfunc=np.mean)

print(pivot_educ_inc)
             income
education          
High       4.000000
Low        5.000000
Medium     7.666667

我真正想要的是使用我的权重列来获取每个教育级别的加权收入平均值。但是我找不到一种方法来定义我可以分配给 aggfunc 并且可以做到这一点的加权均值函数。

对我来说,简单地创建一个加权数据集并不方便(可能吗?),因为权重加起来超过 1 亿。此外,理想情况下,我想使用 aggfunc 参数,因为我的数据集中有更多列,例如教育,我想计算加权平均值,其中一些列有 25 个以上的类别。

我可能完全忽略了这里的某些东西,但我被难住了。

【问题讨论】:

这能回答你的问题吗? Weighted average using pivot tables in pandas 我认为这个答案可能有效,但它没有利用数据透视表函数的 aggfunc 参数。 【参考方案1】:

我是pivot_table 的忠实粉丝,所以这里有一个使用它的解决方案:

pivot = df.pivot_table(values='income',
                       index='education',
                       aggfunc=lambda rows: np.average(rows, weights=df.loc[rows.index, 'weights']))

生成的数据框如下:

             income
education          
High       4.333333
Low        5.433333
Medium     8.056604

【讨论】:

【参考方案2】:

我会添加一个带有加权和的附加列。然后会是这样的:

df = pd.DataFrame(data, columns=['education', 'income', 'weights'])
df['weighted'] = df['income'] * df['weights']


pivot_educ_inc = pd.pivot_table(df, 
                                values=['weights', 'weighted'],
                                index='education',
                                aggfunc=np.sum)

pivot_educ_inc['weighted_avg'] = pivot_educ_inc['weighted'] / pivot_educ_inc['weights']

【讨论】:

这也行,我只是选择了较短的选项!

以上是关于pandas 数据透视表:通过 aggfunc 计算加权平均值的主要内容,如果未能解决你的问题,请参考以下文章

pandas pivot_table透视表crosstab交叉表aggfunc函数详解及实战

为熊猫数据透视表中的每个值列定义 aggfunc

Pandas:排序数据透视表

100天精通Python(数据分析篇)——第66天:Pandas透视表基础+实战案例(pivot_table函数)

一文看懂透视表pivot_table

数据透视表和数据交叉表