2016-11-22 78 views
3

如果此問題已被詢問,但道歉,但事先感謝您的幫助。大熊貓與groupby的部分元素累計總數

在這個「未轉義的」數據集中,有訂單由幾個組成。每個地塊具有給定的值,如下:

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 

我的目標是在每一個Lot級別創建CUMULATIVE_POINTS_PER_YEAR柱表示的POINTS_PER_ORDER累積總和,它本身的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.cumsumPtsPerOrder上的另一個groupby.cumsum,但它沒有產生我所需要的。

+0

CumPtsPerYear是PtsPerOrder的累積和? –

+0

這兩個地段之間的訂單#1234總計12點。 – user791411

+0

正確,但PtsPerOrder的累計總和爲12,24,31 ... –

回答

1

首先,計算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 
+0

謝謝!這是這個技巧! – user791411

+0

*這個*有道理。 –

+0

不,這實際上是爲了@ user791411。我無法理解規範,但是當我在「熊貓」中看到它時,它現在是有道理的。我對許多和ordernums感到困惑。沒意識到這是你!我認爲你的其他答案沒有意義,這只是一個闡述。 –

0

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

我還沒有所著的Grokking您的CumPtsPerYear規範...

+0

感謝您的幫助!在這種情況下,因爲按照該順序(如列中)總共有12個點,並且在隨後的順序中總共有7個點,「CumPtsPerYear」將是12,19。 – user791411

+0

@ user791411是否意外地使我失望了? –

+0

奇怪的是,但我只是upvoted你! – user791411

1

首先,你需要使用transformation

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

然後爲了創建另一個,我沒有fi第二另一種方式,要找到每個組的最大,做一個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