Chinaunix
标题:
以3列分组, 剩的2列聚合, 1列求和,1列求加权平均数
[打印本页]
作者:
ycyutingyong
时间:
2021-08-14 07:39
标题:
以3列分组, 剩的2列聚合, 1列求和,1列求加权平均数
求助: 把源表以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 })
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2