2017-02-14 2 views
0

Ich habe ein DF nach unten:Pandas Summe aus Teilmenge Reihen und Wiederzusammenführen in DF

 id_var1 id_var2 num_var1 num_var2 
     1   1  1   1 
     1   2  1   0 
     1   3  2   0 
     1   4  2   3 
     1   5  3   3 
     1   6  3   3 
     1   7  3   0 
     1   8  4   0 
     2   1  1   0 
     2   2  2   1 
     2   3  5   0 
     2   4  2   0 
     2   5  1   2 
     2   6  1   2 
     2   7  2   0 

Ich möchte ein DF mit folgender Erscheinung:

 id_var1 id_var2 num_var1 num_var2 row_sum 
     1   1  1   1   2  
     1   2  1   0   NaN 
     1   3  2   0   Nan 
     1   4  2   3   11 
     1   5  3   3   Nan 
     1   6  3   3   Nan 
     1   7  3   0   Nan 
     1   8  4   0   Nan 
     2   1  1   0   Nan 
     2   2  2   1   7 
     2   3  5   0   Nan 
     2   4  2   0   Nan 
     2   5  1   2   4 
     2   6  1   2   Nan 
     2   7  2   0   Nan 

An jedem ersten num_var2 was nicht 0 ist Ich möchte sum (num_var1) die selbe Zeile + so viele Zeilen runter wie num_var2 states.

Example1: Zeile 4 hat num_var2 = 3 -> sum (num_var1) für die Zeile 4 + 3 Zeilen nach unten 11 = für id_var1 = 1 und id_var2 = 4

Example2: Reihe 12 hat num_var2 = 2 -> sum (num_var1) für die Zeile 12 + 2 Zeilen nach unten = 4 für id_var1 = 2 und id_var2 = 5.

Kann mir bitte jemand dabei helfen? Kann es ohne eine langsame Zeilen-Iteration gemacht werden?

-Code für DF unter:

df = pd.DataFrame({ 'id_var1' : [1] * 8 + [2] * 7 
        ,'id_var2' : [i for i in range(1,9)] + [i for i in range(1,8)] 
        ,'num_var1' : [1,1,2,2,3,3,3,4] + [1,2,5,2,1,1,2] 
       ,'num_var2' : [1, 0,0,3,3,3,0,0] + [0,1,0,0,2,2,0] 
       }) 

Antwort

0

Lassen Sie mich wissen, ob dies für Sie arbeitet.

Erstellen Sie zuerst eine Liste mit Werten aus der Spalte num_var1. Dann die Summe der Unterliste abrufen - Erstellt von num_var1, vom aktuellen Index bis zu den erforderlichen Zahlenelementen (aus der Spalte num_var2).

Die Funktion sublst() wird nur aufgerufen, wenn der num_var2 des vorherigen Datensatzes nicht mit dem num_var2 des aktuellen Datensatzes übereinstimmt.

import pandas as pd 

df = pd.DataFrame({ 'id_var1' : [1] * 8 + [2] * 7 
        ,'id_var2' : [i for i in range(1,9)] + [i for i in range(1,8)] 
        ,'num_var1' : [1,1,2,2,3,3,3,4] + [1,2,5,2,1,1,2] 
       ,'num_var2' : [1, 0,0,3,3,3,0,0] + [0,1,0,0,2,2,0] 
       }) 

num_var1 =df['num_var1'].tolist() # values to be used for calcualtion 
df['index1'] = df.index 

def sublst(row): 
    if row['num_var2']>0: 
     x= num_var1[row['index1']:row['index1']+row['num_var2']+1] 
     return sum(x) 

df['sum'] = df[df.num_var2 != df.num_var2.shift()].apply(sublst,axis=1) 

print df 

Ausgabe

 id_var1 id_var2 num_var1 num_var2 index1 sum 
0   1  1   1   1  0 2.0 
1   1  2   1   0  1 NaN 
2   1  3   2   0  2 NaN 
3   1  4   2   3  3 11.0 
4   1  5   3   3  4 NaN 
5   1  6   3   3  5 NaN 
6   1  7   3   0  6 NaN 
7   1  8   4   0  7 NaN 
8   2  1   1   0  8 NaN 
9   2  2   2   1  9 7.0 
10  2  3   5   0  10 NaN 
11  2  4   2   0  11 NaN 
12  2  5   1   2  12 4.0 
13  2  6   1   2  13 NaN 
14  2  7   2   0  14 NaN 
+0

hat den Trick, danke! – swepab