簡體   English   中英

Pandas與groupby的部分元素的累積和

[英]Pandas cumulative sum of partial elements with groupby

如果已經提出這個問題,請道歉,但提前感謝您的幫助。

在這個“不透明”的數據集中,有幾個由很多批次組成的訂單 每個地段都有一個給定的Point值,如下所示:

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列,表示POINTS_PER_ORDER的累積總和,它本身就是每個Lot級別的PtsPerLot的總和。 因此,對於給定的批次, CumPtsPerYear將顯示給定年份中帳戶的所有POINTS_PER_ORDER的累計總數。

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

有任何想法嗎? 我試過groupby.cumsumPtsPerLot和另一groupby.cumsumPtsPerOrder ,但它不是生產什么,我需要。

首先,計算PtsPerOrder 使用transform可以沿着數據幀的實際索引廣播每組中的計算結果:

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

然后在每個組中獲取該新列的第一個元素:

df['CumPtsPerYear'] = df.groupby('OrderNum')['PtsPerOrder'].head(1)

df
Out[27]: 
  CustID      Date  OrderNum LotNum  PtsPerLot  PtsPerOrder  CumPtsPerYear
0   A123  1/1/2015      1234      A          2           12           12.0
1   A123  1/1/2015      1234      B         10           12            NaN
2   A123  1/1/2015      5678      A          7            7            7.0

通過執行您要搜索的累積總和來結束計算。 它將跳過NA值。 您使用向前填充完成數據框:

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

0    12.0
1    12.0
2    19.0

首先,您需要使用轉換

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

然后,為了創建另一個,我沒有找到另一種方法來找到每個組的最大值,對其做一個cumsum,並將其合並回來:

weird_cumsum = df.groupby('OrderNum')['*PtsPerOrder*'].max().cumsum().to_frame()
weird_cumsum.columns = ['*CumPtsPerYear*']
weird_cumsum

          *CumPtsPerYear*
OrderNum                 
1234                   12
5678                   19

df.merge(weird_cumsum, left_on='OrderNum', right_index=True, how='left')

結果如預期:

  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   

要了解問題的第一部分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

並使用它來創建一個新列...

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

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

我仍然沒有按照你的CumPtsPerYear規范...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM