2017-10-17 9 views
2

を累積和基盤をリセットします。私は、累積合計が大きいかハードルに等しいときに、同じ顧客に基盤をリセットする累積のための追加の列を計算したいのように私は、データフレームを持つ条件パンダに

customer spend hurdle 
A   20 50  
A   31 50  
A   20 50  
B   50 100  
B   51 100  
B   30 100  

次のように:

customer spend hurdle Cumulative 
A   20 50  20 
A   31 50  51 
A   20 50  20 
B   50 100  50 
B   51 100 101 
B   30 100  30 

私は、私は条件にも拠点をリセットする方法がわからないためにパンダにcumsumgroupbyを使用しました。私はそれを知っている

df1['cum_sum'] = df1.groupby(['customer'])['spend'].apply(lambda x: x.cumsum()) 

は普通の累積合計である:以下の

私が現在使用しているコードです。私はあなたの助けに感謝します。

答えて

1

いずれの方法も以下のコードになります。しかし、それは本当に非効率的で控えめな1ライナーです。

df1.groupby('customer').apply(lambda x: (x['spend'].cumsum() *(x['spend'].cumsum() > x['hurdle']).astype(int).shift(-1)).fillna(x['spend'])) 
+0

私はあなたに改良版を追加しました。 – Zero

1

高速で効率的な方法があります。ここでは1つの非効率なapplyする方法です。

In [3270]: def custcum(x): 
     ...:  total = 0 
     ...:  for i, v in x.iterrows(): 
     ...:   total += v.spend 
     ...:   x.loc[i, 'cum'] = total 
     ...:   if total >= v.hurdle: 
     ...:   total = 0 
     ...:  return x 
     ...: 

In [3271]: df.groupby('customer').apply(custcum) 
Out[3271]: 
    customer spend hurdle cum 
0  A  20  50 20.0 
1  A  31  50 51.0 
2  A  20  50 20.0 
3  B  50  100 50.0 
4  B  51  100 101.0 
5  B  30  100 30.0 

あなたは[更新]

​​答えの改良版custcum


をスピードアップするためにcythonnumbaを使用して検討することができます。

In [3276]: s = df.groupby('customer').spend.cumsum() 

In [3277]: np.where(s > df.hurdle.shift(-1), s, df.spend) 
Out[3277]: array([ 20, 51, 20, 50, 101, 30], dtype=int64) 
関連する問題