我希望能够在pandas的groupby agg()中使用自定义函数。我知道可以使用apply选项,但我想要做几次聚合。以下是我尝试实现加权平均的测试代码。
Python 代码
import pandas as pd
import numpy as np
def weighted_avg(df, values, weights):
'''To calculate a weighted average in Pandas. Demo see https://www.statology.org/pandas-weighted-average/
Example: df.groupby('Group Names').apply(w_avg, 'Results', 'AFY')'''
v = df[values]
w = df[weights]
return (v * w).sum() / w.sum()
# below creates a dataframe.
dfr = pd.DataFrame(np.random.randint(1,50,size=(4,4)), columns=list('ABCD'))
dfr['group'] = [1, 1, 0, 1]
print(dfr)
dfr = dfr.groupby('group').agg({'A':'mean', 'B':'sum',
'C': lambda x: weighted_avg(dfr, 'D', 'C')}).reset_index()
print(dfr)
结果 - 输出
A B C D group
0 5 2 17 38 1
1 35 30 22 32 1
2 15 18 16 11 0
3 46 6 20 34 1
group A B C
0 0 15.000000 18 29.413333
1 1 28.666667 38 29.413333
问题:加权平均值返回整个表的值,而不是“group”列的值。如何实现按组计算加权平均值的功能?我尝试将groupby放在函数内部,像这里所示,但没有成功。
谢谢您的查阅。
...在第67行,df_g = df_g.groupby('item_name').agg(weighted_avg,'value', 'weight')... TypeError: weighted_avg()缺少一个必需的位置参数:'weights'
- Shane Sdef weighted_avg(group_df, whole_df, values, weights)
有4个参数,在agg()
中我也使用4个参数调用它。 - Andrej Keselyweighted_avg(dfr.loc[x.index], 'D', 'C')
传递给 lambda,那么可能更直观。 - user7864386