它可以從一個GROUPBY物體apply
返回任何數目的聚合值。簡單地說,返回一個Series,索引值將成爲新的列名。
讓我們看一個簡單的例子:
df = pd.DataFrame({'group':['a','a','b','b'],
'd1':[5,10,100,30],
'd2':[7,1,3,20],
'weights':[.2,.8, .4, .6]},
columns=['group', 'd1', 'd2', 'weights'])
df
group d1 d2 weights
0 a 5 7 0.2
1 a 10 1 0.8
2 b 100 3 0.4
3 b 30 20 0.6
定義將被傳遞到apply
的自定義功能。它隱含地接受一個DataFrame - 意味着data
參數是一個DataFrame。請注意它是如何使用多列,這是不可能的agg
GROUPBY方法:
def weighted_average(data):
d = {}
d['d1_wa'] = np.average(data['d1'], weights=data['weights'])
d['d2_wa'] = np.average(data['d2'], weights=data['weights'])
return pd.Series(d)
調用GROUPBY apply
方法與我們的自定義函數:
df.groupby('group').apply(weighted_average)
d1_wa d2_wa
group
a 9.0 2.2
b 58.0 13.2
您可以通過預先計算的加權獲得更好的性能按照其他答案中的解釋合併到新的DataFrame列中,並完全避免使用apply
。
這可能是更有效地打破這種成幾個操作如下:(1)創建的權重的列中,(2)通過它們的權重標準化觀察,(3)計算加權的觀察和一個分組的分組的總和(4)用權重之和對觀察值的加權和進行歸一化。 – kalu
如果我們想計算許多變量(列)的wavg值,例如除了df ['權重']之外的所有內容? – CPBL
@Wes,有沒有什麼辦法可以一次用'AGG()'和'周圍建np.average一個'lambda'做到這一點(...權重= ...)',或在大熊貓的加權任何新的原生支持意味着這篇文章首次出現? –