gpt4 book ai didi

python - Pandas 计算当前行的聚合值

转载 作者:太空宇宙 更新时间:2023-11-04 09:24:36 25 4
gpt4 key购买 nike

假设我们有这些数据:

df = pd.DataFrame({
'group_id': [100,100,100,101,101,101,101],
'amount': [30,40,10,20,25,80,40]
})
df.index.name = 'id'
df.set_index(['group_id', df.index], inplace=True)

看起来像这样:

             amount
group_id id
100 0 30
1 40
2 10
101 3 20
4 25
5 80
6 40

目标是计算一个新列,即小于当前列的所有金额的总和。 IE。我们想要这个结果。

             amount  sum_of_smaller_amounts
group_id id
100 0 30 10
1 40 40 # 30 + 10
2 10 0 # smallest amount
101 3 20 0 # smallest
4 25 20
5 80 85 # 20 + 25 + 40
6 40 45 # 20 + 25

理想情况下,这应该(非常)高效,因为真实的数据框可能有数百万行。

最佳答案

更好的解决方案(我认为):

df['sum_smaller_amount'] = (df_sort.groupby('group_id')['amount']
.transform(lambda x: x.mask(x.duplicated(),0).cumsum()) -
df['amount'])

输出:

             amount  sum_smaller_amount
group_id id
100 0 30 10.0
1 40 40.0
2 10 0.0
101 3 20 0.0
4 25 20.0
5 80 85.0
6 40 45.0

另一种方法是使用笛卡尔积和过滤器:

df.merge(df.reset_index(), on='group_id', suffixes=('_sum_smaller',''))\
.query('amount_sum_smaller < amount')\
.groupby(['group_id','id'])[['amount_sum_smaller']].sum()\
.join(df, how='right').fillna(0)

输出:

             amount_sum_smaller  amount
group_id id
100 0 10.0 30
1 40.0 40
2 0.0 10
101 3 0.0 20
4 20.0 25
5 85.0 80
6 45.0 40

关于python - Pandas 计算当前行的聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58435032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com