Python “分组方式”仅聚合一列
我有以下形式的数据帧:Python “分组方式”仅聚合一列,python,pandas,group-by,Python,Pandas,Group By,我有以下形式的数据帧: >>> sales = pd.DataFrame({'seller_id':list('AAAABBBB'),'buyer_id':list('CCDECDEF'),\ 'amount':np.random.randint(10,20,size=(8,))}) >>> sales = sales[['seller_id','buyer_id','amount']] >>&g
>>> sales = pd.DataFrame({'seller_id':list('AAAABBBB'),'buyer_id':list('CCDECDEF'),\
'amount':np.random.randint(10,20,size=(8,))})
>>> sales = sales[['seller_id','buyer_id','amount']]
>>> sales
seller_id buyer_id amount
0 A C 18
1 A C 15
2 A D 11
3 A E 12
4 B C 16
5 B D 18
6 B E 16
7 B F 19
现在,我想做的是计算每个卖家在其最大买家的总销售额中所占的份额。我有这样做的代码,但我必须再次重置索引和分组,这是浪费。一定有更好的办法。我想要一个解决方案,在那里我可以一次聚合一列,并将其他列分组。
以下是我当前的代码:
>>> gr2 = sales.groupby(['buyer_id','seller_id'])
>>> seller_buyer_level = gr2['amount'].sum() # sum over different purchases
>>> seller_buyer_level_reset = seller_buyer_level.reset_index('buyer_id')
>>> gr3 = seller_buyer_level_reset.groupby(seller_buyer_level_reset.index)
>>> result = gr3['amount'].max() / gr3['amount'].sum()
>>> result
seller_id
A 0.589286
B 0.275362
我简化了一点。实际上,我也有一个时间段列,所以我想在卖方和时间段级别进行此操作,这就是为什么在gr3中我按多索引进行分组(在本例中,它显示为单个索引)。
我认为会有一个解决方案,我不需要减少和重新分组,只需要从组中聚合一个索引,而将其他索引分组,但在文档或在线中找不到它。有什么想法吗?这里有一行,但它也会重置索引一次:
sales.groupby(['seller_id','buyer_id']).sum().\
reset_index(level=1).groupby(level=0).\
apply(lambda x: x.amount.max()/x.amount.sum())
#seller_id
#A 0.509091
#B 0.316667
#dtype: float64
我会使用
pivot\u table
然后进行广播(请参阅)
首先,使用索引中的卖方id
和列中的买方id
透视数据:
sales_pivot = sales.pivot_table(index='seller_id', columns='buyer_id', values='amount', aggfunc='sum')
然后,将每行中的值除以所述行的总和:
result = sales_pivot.div(sales_pivot.sum(axis=1), axis=0)
最后,您可以调用
result.max(axis=1)
查看每个卖家的最高份额。谢谢!但这将创建一个大小为n_买家*n_卖家的表格,在这个玩具示例中可能会起作用,但在我的真实数据集中永远无法存储。谢谢!我想问题是groupby(level=0)是否很快,因为它是索引。如果是的话,那么这是一个完美的答案。我为你最初的解决方案和我的解决方案计时。你的速度快了30%。所以,我想,我的不值得。我也计时了。我认为只有“应用”这一行会减慢速度。