首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用pandas/dataframe计算加权平均值

使用pandas/dataframe计算加权平均值
EN

Stack Overflow用户
提问于 2014-10-06 02:36:05
回答 6查看 97.5K关注 0票数 50

我有下面的表格。我想根据下面的公式计算按每个日期分组的加权平均值。我可以使用一些标准的常规代码来做到这一点,但是假设这些数据在pandas数据帧中,有没有比迭代更容易的方法来实现这一点呢?

代码语言:javascript
复制
Date        ID      wt      value   w_avg
01/01/2012  100     0.50    60      0.791666667
01/01/2012  101     0.75    80
01/01/2012  102     1.00    100
01/02/2012  201     0.50    100     0.722222222
01/02/2012  202     1.00    80

2012年1月1日w_avg = 0.5 *( 60/ sum(60,80,100)) + .75 * (80/ sum(60,80,100)) + 1.0 * (100/sum(60,80,100))

01/02/2012 w_avg = 0.5 *( 100/ sum(100,80)) + 1.0 *( 80/ sum(100,80))

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-10-06 03:56:52

我想我会和两个groupbys一起做这个。

首先计算“加权平均值”:

代码语言:javascript
复制
In [11]: g = df.groupby('Date')

In [12]: df.value / g.value.transform("sum") * df.wt
Out[12]:
0    0.125000
1    0.250000
2    0.416667
3    0.277778
4    0.444444
dtype: float64

如果您将其设置为列,则可以对其进行分组:

代码语言:javascript
复制
In [13]: df['wa'] = df.value / g.value.transform("sum") * df.wt

现在,该列的总和是所需的:

代码语言:javascript
复制
In [14]: g.wa.sum()
Out[14]:
Date
01/01/2012    0.791667
01/02/2012    0.722222
Name: wa, dtype: float64

或者潜在的:

代码语言:javascript
复制
In [15]: g.wa.transform("sum")
Out[15]:
0    0.791667
1    0.791667
2    0.791667
3    0.722222
4    0.722222
Name: wa, dtype: float64
票数 29
EN

Stack Overflow用户

发布于 2015-10-10 21:09:17

让我们首先创建示例pandas dataframe:

代码语言:javascript
复制
In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: index = pd.Index(['01/01/2012','01/01/2012','01/01/2012','01/02/2012','01/02/2012'], name='Date')

In [4]: df = pd.DataFrame({'ID':[100,101,102,201,202],'wt':[.5,.75,1,.5,1],'value':[60,80,100,100,80]},index=index)

然后,按'value‘加权并按指数分组的'wt’的平均值如下所示:

代码语言:javascript
复制
In [5]: df.groupby(df.index).apply(lambda x: np.average(x.wt, weights=x.value))
Out[5]: 
Date
01/01/2012    0.791667
01/02/2012    0.722222
dtype: float64

或者,也可以定义一个函数:

代码语言:javascript
复制
In [5]: def grouped_weighted_avg(values, weights, by):
   ...:     return (values * weights).groupby(by).sum() / weights.groupby(by).sum()

In [6]: grouped_weighted_avg(values=df.wt, weights=df.value, by=df.index)
Out[6]: 
Date
01/01/2012    0.791667
01/02/2012    0.722222
dtype: float64
票数 44
EN

Stack Overflow用户

发布于 2015-10-28 21:18:12

我觉得以下是这个问题的一个优雅的解决方案:(Pandas DataFrame aggregate function using multiple columns)

代码语言:javascript
复制
grouped = df.groupby('Date')

def wavg(group):
    d = group['value']
    w = group['wt']
    return (d * w).sum() / w.sum()

grouped.apply(wavg)
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26205922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档