[英]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.cumsum
上PtsPerLot
和另一groupby.cumsum
上PtsPerOrder
,但它不是生產什么,我需要。
首先,計算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.