求助: 把源表以k1, k2, k3这3列为分组, 3列的组合完全相同为1组, 分组之后, 后面2列聚合运算, 数量列求和, 均价的列 求加权平均价, (加权平均价= (均价*数量).sum / 数量.sum ),然后得到1个新的结果的表, 我看到书上说分组后可以用字典对不同的列作不同的函数处理, 例子都是系统或库自带有的函数可以实现, 但没有举例其中某列用了自定义函数的情况, 我均价用自定义函数求加权平均价, 就没成功, 我就用代码比较多的方式, 如下的代码绕来绕去, 确实也得到了我想要的结果, 但是感觉复杂了, 请问下老师用简单点少的代码如何实现想得到的表的结果.
源表 | | | | | k1 | k2 | k3 | 数量 | 均价 | 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 | | | | | | 结果 | | | | | k1 | k2 | k3 | 数量 | 均价 | 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'],
'数量':[2,1,1,3,5],
'均价':[15,10,5,10,3]})
def jj(g): #加权平均
g['均价']=(g['均价']* g['数量']).sum() / g['数量'].sum()
return g
df1=df.groupby(['k1','k2','k3']).apply(jj)
df1=df1.groupby(['k1','k2','k3','均价'],as_index=False).agg({'数量':np.sum})
print(df,'\n'*2,df1)
#上面的代码确实得到了想要的结果, 但是复杂了, 想简单一点能实现的方法
#尝试了用下面的两种语句实现上面代码得到的结果,但是报错,请问大师,实现上面代码的结果的语句,简单点的可以用啥代码实现
#df1=df.groupby(by=['k1','k2','k3']).agg({'数量':np.sum,'均价':lambda g:np.average(g['均价'],weights=g['数量'])})
#df1=df.groupby(by=['k1','k2','k3']).agg({'数量':np.sum,'均价':jj })
|