免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11333 | 回复: 0

以3列分组, 剩的2列聚合, 1列求和,1列求加权平均数 [复制链接]

论坛徽章:
0
发表于 2021-08-14 07:39 |显示全部楼层
求助: 把源表以k1, k2, k3这3列为分组, 3列的组合完全相同为1组,  分组之后, 后面2列聚合运算, 数量列求和,  均价的列 求加权平均价,  (加权平均价= (均价*数量).sum / 数量.sum ),然后得到1个新的结果的表,   我看到书上说分组后可以用字典对不同的列作不同的函数处理, 例子都是系统或库自带有的函数可以实现, 但没有举例其中某列用了自定义函数的情况,  我均价用自定义函数求加权平均价, 就没成功,  我就用代码比较多的方式, 如下的代码绕来绕去, 确实也得到了我想要的结果,  但是感觉复杂了,    请问下老师用简单点少的代码如何实现想得到的表的结果.
源表
k1k2k3数量均价
ABD215
ABD110
ABC15
ABC310
BBC53
结果
k1k2k3数量均价
ABC48.75
ABD313.33
BBC53


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 })
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP