2017-01-17 1 views
3

Während sie durch die variableA Spalte laufen, möchte ich eine neue Spalte erzeugen, die die Summe von values ist, wenn eine Zeile in entwedervariableA oder variableB den Strom gleich Zeilenwerte von variableA. Beispieldaten:Python Pandas: Finden Summe der Spalte basierend auf dem Wert von zwei anderen Säulen

values variableA variableB 
    0 134  1    3 
    1 12  2    6 
    2 43  1    2 
    3 54  3    1 
    4 16  2    7 

ich die Summe von values wählen können, wann immer variableA die aktuelle Zeile von variableA mit matches:

df.groupby('variableA')['values'].transform('sum') 

aber die Summe von values Auswahl, wenn variableB die aktuelle Zeile von variableA Spiele entzieht sich mir . Ich versuchte .loc, aber es scheint nicht gut mit .groupby zu spielen. Die erwartete Ausgabe wäre wie folgt:

values variableA variableB result 
    0 134  1    3  231 
    1 12  2    6  71 
    2 43  1    2  231 
    3 54  3    1  188 
    4 16  2    7  71 

Vielen Dank!

Antwort

2

Eine vektorisierte Ansatz mit numPy Rundfunk

vars = df[['variableA', 'variableB']].values 
matches = (vars[:, None] == vars[:, [0]]).any(-1) 

df.assign(result=df['values'].values @ matches) # @ operator with python 3 
# use this for use python 2 
# df.assign(result=df['values'].values.dot(matches)) 

enter image description here


Zeittests

enter image description here

2

Nun, könnte man immer .apply verwenden, aber seien Sie gewarnt: es kann langsam sein:

>>> df 
    values variableA variableB 
0  134   1   3 
1  12   2   6 
2  43   1   2 
3  54   3   1 
4  16   2   7 
>>> df.apply(lambda S: df.loc[(df.variableA == S.variableA) | (df.variableB == S.variableA), 'values'].sum(), axis=1) 
0 231 
1  71 
2 231 
3 188 
4  71 
dtype: int64 

Natürlich würden Sie es zuweisen müssen ...

>>> df['result'] = df.apply(lambda S: df.loc[(df.variableA == S.variableA) | (df.variableB == S.variableA), 'values'].sum(), axis=1) 
>>> df 
    values variableA variableB result 
0  134   1   3  231 
1  12   2   6  71 
2  43   1   2  231 
3  54   3   1  188 
4  16   2   7  71 
Verwandte Themen