Pandas使用groupby累积部分元素的总和

2024-10-01 09:33:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如果已经有人问过这个问题,我深表歉意,但请提前感谢您的帮助。在

在这个“未激励”的数据集中,存在由几个批次组成的订单。每个批次都有一个给定的值,如下所示:

CustID     Date         OrderNum   LotNum   PtsPerLot
A123       1/1/2015     1234       A        2            
A123       1/1/2015     1234       B        10
A123       1/1/2015     5678       A        7

我的目标是创建一个CUMULATIVE_POINTS_PER_YEAR列,它表示在每个Lot级别的POINTS_PER_ORDER的累计和,这本身就是PtsPerLot的和。因此,对于一个给定的批次,CumPtsPerYear将显示某个账户在某一年内所有POINTS_PER_ORDER的累计总数。在

^{pr2}$

有什么想法吗?我试过groupby.cumsumPtsPerLot上,另一个groupby.cumsum在{}上,但它没有产生我需要的东西。在


Tags: 数据订单目标dateorderpointsgroupbyper
3条回答

要进入问题的第一部分,PtsPerOrder,您需要一个转换sum是一个聚合。所以使用.transform

In [10]: df
Out[10]:
            Date  OrderNum LotNum  PtsPerLot
CustID
A123    1/1/2015      1234      A          2
A123    1/1/2015      1234      B         10
A123    1/1/2015      5678      A          7

In [11]: df.groupby('OrderNum')['PtsPerLot'].transform('sum')
Out[11]:
CustID
A123    12
A123    12
A123     7
dtype: int64

然后用它来创建一个新的列。。。在

^{pr2}$

我还是没去查你的CumPtsPerYear规格。。。在

首先,计算PtsPerOrder。使用transform沿数据帧的实际索引广播每组的计算结果:

df['PtsPerOrder'] = df.groupby('OrderNum')['PtsPerLot'].transform(sum)

然后取每个组中新列的第一个元素:

^{pr2}$

通过执行要搜索的累计和结束计算。它将跳过NA值。使用前向填充完成数据帧:

df['CumPtsPerYear'].cumsum().ffill()

0    12.0
1    12.0
2    19.0

首先需要使用transformation

df['*PtsPerOrder*'] = df.groupby('OrderNum')['PtsPerLot'].transform(sum)

然后为了创建另一个,我没有找到另一种方法来找到每个组的最大值,对其进行累计,然后将其合并到:

^{pr2}$

结果如预期:

  CustID       Date  OrderNum LotNum  PtsPerLot  *PtsPerOrder*  *CumPtsPerYear* 
0   A123 2015-01-01      1234      A          2             12             12  
1   A123 2015-01-01      1234      B         10             12             12   
2   A123 2015-01-01      5678      A          7              7             19   

相关问题 更多 >