【发布时间】:2017-10-12 16:25:14
【问题描述】:
我使用 groupby 和 agg 计算了许多聚合函数,因为我需要针对不同的变量使用不同的聚合函数,例如不是所有的总和,而是 x 的总和和平均值、y 的平均值等。
有没有办法使用 agg 计算加权平均值?我找到了很多例子,但没有一个是 agg。
我可以手动计算加权平均值,如下面的代码(注意带**的行),但我想知道是否有更优雅和直接的方法?
我可以创建自己的函数并将其与 agg 一起使用吗?
为了清楚起见,我完全理解还有其他解决方案,例如
-
Calculate weighted average with pandas dataframe
还有很多很多。但是,正如我所说,我不确定如何使用 agg 实现这些解决方案,我需要 agg 因为我需要将不同的聚合函数应用于不同的列(同样,不是所有的总和,但 x 的总和和平均值,y 的平均值等)。
import numpy as np
import pandas as pd
df= pd.DataFrame(np.random.randint(5,8,(1000,4)), columns=['a','b','c','d'])
**df['c * b']= df['c']* df['b']**
g = df.groupby('a').agg(
{'b':['sum', lambda x: x.sum() / df['b'] .sum(), 'mean'],
'c':['sum','mean'], 'd':['sum'],
'c * b':['sum']})
g.columns = g.columns.map('_'.join)
**g['weighted average of c'] = g['c * b_sum'] / g['b_sum']**
【问题讨论】:
-
运行 'c * b':[lambda x: x.sum() / df['b'].sum() ] 不起作用,因为这将 [c * b] 除以 b 的总和,即它将每一行除以相同的数字,这不是我在这里需要的。
-
您能否给出样本输入,可能是一个固定的随机种子,然后是您的预期输出?
np.random.seed(123) -
当然。设置 np.random.seed(123) groupby 返回 3 行,加权平均值为:[6, 6.06 , 6.05]。这可以在我手动计算的列中看到(底部带有**的代码行)。
-
为什么不只为选定的变量做手段,然后为其他选定的变量做标准。有时,多行方法实际上比单行方法(语法方面)要好得多,而且效率也不低
标签: python pandas pandas-groupby