求助: 把源表以k1, k2, k3這3列為分組, 3列的組合完全相同為1組, 分組之后, 后面2列聚合運算, 數(shù)量列求和, 均價的列 求加權(quán)平均價, (加權(quán)平均價= (均價*數(shù)量).sum / 數(shù)量.sum ),然后得到1個新的結(jié)果的表, 我看到書上說分組后可以用字典對不同的列作不同的函數(shù)處理, 例子都是系統(tǒng)或庫自帶有的函數(shù)可以實現(xiàn), 但沒有舉例其中某列用了自定義函數(shù)的情況, 我均價用自定義函數(shù)求加權(quán)平均價, 就沒成功, 我就用代碼比較多的方式, 如下的代碼繞來繞去, 確實也得到了我想要的結(jié)果, 但是感覺復(fù)雜了, 請問下老師用簡單點少的代碼如何實現(xiàn)想得到的表的結(jié)果.
源表 | | | | | k1 | k2 | k3 | 數(shù)量 | 均價 | A | B | D | 2 | 15 | A | B | D | 1 | 10 | A | B | C | 1 | 5 | A | B | C | 3 | 10 | B | B | C | 5 | 3 | | | | | | 結(jié)果 | | | | | k1 | k2 | k3 | 數(shù)量 | 均價 | A | B | C | 4 | 8.75 | A | B | D | 3 | 13.33 | B | B | C | 5 | 3 |
import pandas as pd
import numpy as np
df=pd.DataFrame({'k1':['A','A','A','A','B',],
'k2':['B','B','B','B','B'],
'k3':['D','D','C','C','C'],
'數(shù)量':[2,1,1,3,5],
'均價':[15,10,5,10,3]})
def jj(g): #加權(quán)平均
g['均價']=(g['均價']* g['數(shù)量']).sum() / g['數(shù)量'].sum()
return g
df1=df.groupby(['k1','k2','k3']).apply(jj)
df1=df1.groupby(['k1','k2','k3','均價'],as_index=False).agg({'數(shù)量':np.sum})
print(df,'\n'*2,df1)
#上面的代碼確實得到了想要的結(jié)果, 但是復(fù)雜了, 想簡單一點能實現(xiàn)的方法
#嘗試了用下面的兩種語句實現(xiàn)上面代碼得到的結(jié)果,但是報錯,請問大師,實現(xiàn)上面代碼的結(jié)果的語句,簡單點的可以用啥代碼實現(xiàn)
#df1=df.groupby(by=['k1','k2','k3']).agg({'數(shù)量':np.sum,'均價':lambda g:np.average(g['均價'],weights=g['數(shù)量'])})
#df1=df.groupby(by=['k1','k2','k3']).agg({'數(shù)量':np.sum,'均價':jj })
|