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%。所以,我想,我的不值得。我也计时了。我认为只有“应用”这一行会减慢速度。