पायथन में एक समाधान की तलाश में जैसा कि यहां चर्चा की गई है R: Sum to 0 पहुँच गया है और फिर पुनः आरंभ करें

मेरे पास एक समान डेटाफ़्रेम है और मैं एप्लायंस कॉलम में मूल्यों का संचयी योग चाहता हूं जब रन कॉलम में मान 0 होता है और जब रन कॉलम में मान 0 से 1 में बदल जाता है तो गिनती को शून्य पर रीसेट कर देता है।

        Home   Date     Time   Appliance Run   
          2  1/21/2017  1:30:00      100    1 
          2  1/21/2017  1:45:00      207    1 
          2  1/21/2017  2:00:00      310    1       
          2  1/21/2017  2:15:00      450    1       
          2  1/21/2017  2:30:00      804    0      
          2  1/21/2017  2:45:00      556    0     
          2  1/21/2017  3:00:00      844    0    
          2  1/21/2017  3:15:00      396    0    
          2  1/21/2017  3:30:00      392    0    
          2  1/21/2017  3:45:00      1220   0    
          2  1/21/2017  4:00:00      455    1      
          2  1/21/2017  4:15:00      550    1       
          2  1/21/2017  4:30:00      600    1       
          2  1/21/2017  4:45:00      809    1       
          2  1/22/2017  3:30:00      609    1       
          2  1/22/2017  3:45:00      244    0    
          2  1/22/2017  4:00:00     1068    0    
          2  1/22/2017  4:15:00      44     0    
          2  1/22/2017  4:30:00     1240    0    
          2  1/22/2017  4:45:00      40     0    
          2  1/22/2017  5:00:00     1608    0    
          2  1/22/2017  5:15:00       0     1       
          2  1/22/2017  5:30:00       0     1       

मैंने नीचे दिए गए कोड की कोशिश की है। लेकिन यह सिर्फ पिछली पंक्ति मान जोड़ता है और संचयी योग नहीं करता है

newcum = []
lastvalue = 0

for i, row in df.iterrows():
    if df['Run'][i+1] == 0 :
        lastvalue += x['Appliance'][i] 
    else:
        lastvalue = 0
    newcum.append(lastvalue)
df['value'] = newcum

मेरा वांछित आउटपुट वैल्यू कॉलम में निम्नानुसार है:

        Home   Date     Time   Appliance Run   value
          2  1/21/2017  1:30:00      100    1       0
          2  1/21/2017  1:45:00      207    1       0
          2  1/21/2017  2:00:00      310    1       0
          2  1/21/2017  2:15:00      450    1       0
          2  1/21/2017  2:30:00      804    0     804
          2  1/21/2017  2:45:00      556    0    1360
          2  1/21/2017  3:00:00      844    0    2204
          2  1/21/2017  3:15:00      396    0    2600
          2  1/21/2017  3:30:00      392    0    2992
          2  1/21/2017  3:45:00      1220   0    4212
          2  1/21/2017  4:00:00      455    1       0
          2  1/21/2017  4:15:00      550    1       0
          2  1/21/2017  4:30:00      600    1       0
          2  1/21/2017  4:45:00      809    1       0
          2  1/22/2017  3:30:00      609    1       0
          2  1/22/2017  3:45:00      244    0    244
          2  1/22/2017  4:00:00     1068    0    1312
          2  1/22/2017  4:15:00      44     0    1356
          2  1/22/2017  4:30:00     1240    0    2596
          2  1/22/2017  4:45:00      40     0    2636
          2  1/22/2017  5:00:00     1608    0    4244
          2  1/22/2017  5:15:00       0     1       0
          2  1/22/2017  5:30:00       0     1       0

क्या कोई इसमें मेरी मदद कर सकता है?

1
anonymous13 26 जिंदा 2022, 20:31
आपके पास Rub नाम का कोई कॉलम नहीं है। कृपया अपना न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण ठीक करें
 – 
Mad Physicist
26 जिंदा 2022, 20:33
कृपया एक उदाहरण डेटा फ़्रेम परिभाषा प्रदान करें
 – 
gerda die gandalfziege
26 जिंदा 2022, 20:33
मुझे लगता है कि उसका मतलब "भागो" था
 – 
gerda die gandalfziege
26 जिंदा 2022, 20:36
@gerdadiegandalfziege। अप्रासंगिक। प्रश्न कहता है Rub। या तो दिखाया गया कोड नहीं चलाया गया था, या इसे सही ढंग से कॉपी-पेस्ट नहीं किया गया था। किसी भी तरह से, मैं परिणामों पर भरोसा नहीं कर सकता।
 – 
Mad Physicist
26 जिंदा 2022, 20:37
मैं इसके लिए 100% सहमत हूँ
 – 
gerda die gandalfziege
26 जिंदा 2022, 20:39

2 जवाब

सबसे बढ़िया उत्तर

हम उपकरण के लिए फ़िल्टर कर सकते हैं, और groupby कुंजी की गणना cumsum के साथ कर सकते हैं, ध्यान दें कि जब उपकरण 0 है तो कमसम में वृद्धि नहीं होगी और इसे नंबर 1 से विभाजित किया गया था।

df['new'] = df.loc[df['Run'].eq(0)].groupby(df['Run'].cumsum())['Appliance'].cumsum()
df['new'].fillna(0,inplace=True)
df
Out[78]: 
    Home       Date     Time  Appliance  Run     new
0      2  1/21/2017  1:30:00        100    1     0.0
1      2  1/21/2017  1:45:00        207    1     0.0
2      2  1/21/2017  2:00:00        310    1     0.0
3      2  1/21/2017  2:15:00        450    1     0.0
4      2  1/21/2017  2:30:00        804    0   804.0
5      2  1/21/2017  2:45:00        556    0  1360.0
6      2  1/21/2017  3:00:00        844    0  2204.0
7      2  1/21/2017  3:15:00        396    0  2600.0
8      2  1/21/2017  3:30:00        392    0  2992.0
9      2  1/21/2017  3:45:00       1220    0  4212.0
10     2  1/21/2017  4:00:00        455    1     0.0
11     2  1/21/2017  4:15:00        550    1     0.0
12     2  1/21/2017  4:30:00        600    1     0.0
13     2  1/21/2017  4:45:00        809    1     0.0
14     2  1/22/2017  3:30:00        609    1     0.0
15     2  1/22/2017  3:45:00        244    0   244.0
16     2  1/22/2017  4:00:00       1068    0  1312.0
17     2  1/22/2017  4:15:00         44    0  1356.0
18     2  1/22/2017  4:30:00       1240    0  2596.0
19     2  1/22/2017  4:45:00         40    0  2636.0
20     2  1/22/2017  5:00:00       1608    0  4244.0
21     2  1/22/2017  5:15:00          0    1     0.0
22     2  1/22/2017  5:30:00          0    1     0.0
1
BENY 26 जिंदा 2022, 20:43
2
fillna: df.loc[df['Run'].eq(0)].groupby(df['Run'].cumsum())['Appliance'].cumsum().reindex(df.index, fill_value=0) से बचने के लिए आप दूसरे कमसम के बाद reindex जोड़ सकते हैं
 – 
Corralien
26 जिंदा 2022, 20:52

आप इस तरह से समूह के लिए एक लेबल उत्पन्न कर सकते हैं:

label = (df.Run.diff().fillna(df.Run.iloc[0]) == 1).cumsum()

अब आप प्रत्येक समूह का समूह और योग कर सकते हैं:

df.value = (df.Appliance * (1 - df.Run)).groupby(label).cumsum()
1
Mad Physicist 26 जिंदा 2022, 21:00
धन्यवाद यह काम किया।
 – 
anonymous13
26 जिंदा 2022, 21:17