2017-10-17 9 views
2

조건 판다에 누계베이스 재설정I가 같은 데이터 프레임이

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

한 가지 방법은 아래 코드입니다. 그러나 그것은 정말로 비효율적이고 부끄럽지 않은 단 하나의 라이너입니다.

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

개선 된 버전을 추가했습니다. – Zero

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


[업데이트] Ido s 대답

향상된 버전을 빠르게 cython 또는 numba 사용을 고려할 수 있습니다.

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) 
관련 문제