2017-01-02 5 views
5

내가 연속 1 값의 그룹 내 data_binary의 누적 합계를 계산하려면 df파이썬 팬더 조건부 누적 합계는

data data_binary sum_data 
    2  1   1 
    5  0   0 
    1  1   1 
    4  1   2 
    3  1   3 
    10  0   0 
    7  0   0 
    3  1   1 

내 dataframe 고려하십시오.

1의 첫 번째 그룹은 1이고 sum_data1입니다. 그러나 1의 두 번째 그룹은 3 1 '이고 sum_data[1, 2, 3]입니다.

나는 np.where(df['data_binary'] == 1, df['data_binary'].cumsum(), 0)를 사용하여 시도했지만 그게 내가 원하는 것을하지 않는

array([1, 0, 2, 3, 4, 0, 0, 5]) 

를 반환합니다.

+2

무엇을 시도했으며 요구 사항은 무엇입니까? 귀하의 질문은 명확하지 않습니다. 편집하십시오. – MYGz

+0

데이터 열을 사용하여 sum_data를 계산하고 싶습니다. – GrayHash

+0

당신이 원하는 결과와 시도하지 못한 결과가 아직 실마리가 아닙니다. – dartdog

답변

5

는 생각 할 수 있습니다 groupby 같지 않음 (!=) 다음 cumsum에 의해 그룹을 만들 경우 처음 shift 에드 열을 기준으로 다음 값을 비교 Series하여 DataFrameGroupBy.cumsum와. 마지막 mask와 열 data_binary에 의해 0 교체 : 당신이 data_binary의 누적 합계를 가지고 data_binary이 영 (0) 최신 누적 합계를 차감 할

print (df.data_binary.ne(df.data_binary.shift()).cumsum()) 
0 1 
1 2 
2 3 
3 3 
4 3 
5 4 
6 4 
7 5 
Name: data_binary, dtype: int32 

df['sum_data1'] = df.data_binary.groupby(df.data_binary.ne(df.data_binary.shift()).cumsum()) 
           .cumsum() 
df['sum_data1'] = df['sum_data1'].mask(df.data_binary == 0, 0) 
print (df) 
    data data_binary sum_data sum_data1 
0  2   1   1   1 
1  5   0   0   0 
2  1   1   1   1 
3  4   1   2   2 
4  3   1   3   3 
5 10   0   0   0 
6  7   0   0   0 
7  3   1   1   1 
+0

이제 귀족 모자가 생겼습니다! – piRSquared

9

.

b = df.data_binary 
c = b.cumsum() 
c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int) 

0 1 
1 0 
2 1 
3 2 
4 3 
5 0 
6 0 
7 1 
Name: data_binary, dtype: int64 

설명

cols = ['data_binary', 'cumulative_sum', 'nan_non_zero', 'forward_fill', 'final_result'] 
print(pd.concat([ 
     b, c, 
     c.mask(b != 0), 
     c.mask(b != 0).ffill(), 
     c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int) 
    ], axis=1, keys=cols)) 


    data_binary cumulative_sum nan_non_zero forward_fill final_result 
0   1    1   NaN   NaN    1 
1   0    1   1.0   1.0    0 
2   1    2   NaN   1.0    1 
3   1    3   NaN   1.0    2 
4   1    4   NaN   1.0    3 
5   0    4   4.0   4.0    0 
6   0    4   4.0   4.0    0 
7   1    5   NaN   4.0    1 

cumulative_sum의 문제가 data_binary가 제로의 행을 수행한다는 것입니다의 측면에서 각 단계의 측면을보고 시작하자 합계를 재설정하지 마십시오. 이것이 바로이 솔루션의 동기입니다. data_binary이 0 일 때 합계를 "재설정"하는 방법은 무엇입니까? 쉬운! data_binary이 0 인 누적 합계를 슬라이스하여 값을 채 웁니다. 이 값과 누적 합계의 차이를 취하면 합계를 효과적으로 재설정했습니다.