2017-01-02 57 views
5

ben bitişik 1 değerlerin grupları içinde data_binary kümülatif toplamını hesaplamak isteyen dfpiton pandalar şartlı kümülatif toplamı

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 

benim dataframe düşünün.

1 'ün ilk grubu, bir 1 ve sum_data ürününün yalnızca bir 1 ürününe sahiptir. Bununla birlikte, 1 'un ikinci grubu 3 1' ve sum_data, [1, 2, 3]'dur.

Ben np.where(df['data_binary'] == 1, df['data_binary'].cumsum(), 0) kullanarak denedim ama benim istediğim değil hangi

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

döndürür.

+2

Neyi denediniz ve gereksiniminiz nedir? Sorunuz net değil. Düzenle. – MYGz

+0

Veri sütunlarını kullanarak sum_data hesaplamak istiyorum. – GrayHash

+0

hala hangi sonucu istediğinizi ve işe yaramayacak denemelerinizi bir ipucu değil. – dartdog

cevap

5

Bence yapabilirsiniz groupby eşit değildir (!=) ve daha sonra cumsum tarafından grupları oluşturmak eğer ilk shift ed sütuna göre sonraki değerini karşılaştırmak Series tarafından DataFrameGroupBy.cumsum ile. Son mask ile sütuna data_binary tarafından 0 değiştirin: Eğer data_binary kümülatif toplamı alıp data_binary sıfırdı en son toplu toplamını çıkarmak isteyen

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

Artık maverick şapkası var! – 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 

Açıklama

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 sorun data_binary sıfır satırları yapmak olduğunu tarafındaki her adım tarafında bakarak başlayalım toplamı sıfırlamayın. Ve bu çözüm için motivasyon budur. data_binary sıfır olduğunda toplamı nasıl sıfırlarız? Kolay! data_binary'un sıfır olduğu kümülatif toplamı diliyorum ve ileriye doğru değerleri doldurun. Bu ile birikimli toplam arasındaki farkı aldığımda, toplamı etkili bir şekilde sıfırladım.