2017-01-02 36 views
5

मेरी dataframe पर विचार करें 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 

मैं सन्निहित 1 मूल्यों के समूहों के भीतर data_binary के संचयी योग गणना करना चाहते हैं।

1 का पहला समूह एक 1 और sum_data में केवल 1 है। हालांकि, 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

मुझे लगता है कि आप DataFrameGroupBy.cumsumSeries से है, जिसकी पहली shift एड कॉलम के आधार पर अगले मूल्य की तुलना करता है, तो बराबर नहीं (!=) और फिर cumsum द्वारा समूह बनाने के साथ groupby कर सकते हैं। अंतिम mask साथ स्तंभ 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

आप data_binary के संचयी योग लेने के लिए और सबसे हाल ही में संचयी योग जहां data_binary शून्य था घटाना चाहते हैं।

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 शून्य होने पर हम योग को "रीसेट" कैसे कर सकते हैं? आसान! मैं संचयी योग को टुकड़ा करता हूं जहां data_binary शून्य है और आगे मानों को भरें। जब मैं इस और संचयी योग के बीच अंतर लेता हूं, तो मैंने प्रभावी रूप से योग को रीसेट कर दिया है।

संबंधित मुद्दे