我想将销售数量除以销售机会数量,以便按机会获得平均销售额。
以下是具有混合类型的示例数据框:
df = pd.DataFrame({'Opportunity':['AB122','AB122','AB123', 'AB124'],
'Quantity': [2, 3, 4, 1],
'Member': ["AACC", "AACC", "AACC", 'DDEE']})
print (df)
Opportunity Quantity Member
0 AB122 2 AACC
1 AB122 3 AACC
2 AB123 4 AACC
3 AB124 1 DDEE
我能够得到这个销售额的总和
df.pivot_table('Quantity', 'Member', aggfunc=np.sum)
但是,如果我对商机做同样的事情,我只会把商机名称粘合在一起。此外,重复机会仍然包括在内。
df.pivot_table('Opportunity','Member', aggfunc=np.sum)
我需要的是,机会是计算在内的,但是只有独特的机会(AACC应该只有2个机会)。计数结果应为:
print (df2)
AACC 2
DDEE 1
因此,我可以通过将销售数量除以机会数量来获得平均会员销售量:
print (df3)
AACC 4.5
DDEE 1
关于计算的注意事项。 AACC获得2,因为9除以2为4.5,DDEE获得1为1除以1为1。
答案 0 :(得分:0)
您可以在此处使用groupby.apply
来获得平均销售,因此我们不必两次进行分组方式:
df.groupby('Member').apply(lambda x: x['Quantity'].sum() / x['Opportunity'].nunique())
Member
AACC 4.5
DDEE 1.0
dtype: float64
要获取列名,请使用reset_index
:
df.groupby('Member').apply(lambda x: x['Quantity'].sum() / x['Opportunity'].nunique())\
.reset_index(name='avg sale')
Member avg sale
0 AACC 4.5
1 DDEE 1.0
答案 1 :(得分:0)
df.groupby('Member').apply(lambda x: x.Quantity.sum())
这将按成员列对df进行分组,然后将每个组的数量求和,例如:
Member Opportunity Quantity
0 AACC AB122 1
1 AACC AB122 3
2 DDDD AB123 4
3 AACC AB124 1
将产生: 会员 AACC 5 DDDD 4 dtype:int64