2014-09-09 20 views
47

Ich habe folgenden Datenrahmen:Pandas: Summe Datenrahmen Reihen für bestimmte Spalten

import pandas as pd 
df = pd.DataFrame({'a': [1,2,3], 'b': [2,3,4], 'c':['dd','ee','ff'], 'd':[5,9,1]}) 

Ich mag eine Spalte ‚e‘ hinzuzufügen, die die Summe der Spalte ‚a‘, ‚b‘ und ‚d ".

über Foren gehen, dachte ich so etwas wie dies funktionieren würde:

df['e'] = df[['a','b','d']].map(sum) 

Aber nein!

Ich möchte den Betrieb mit der Liste der Spalten ['a','b','d'] und df als Eingänge realisieren.

Antwort

96

können Sie nur sum und ParamSetzen axis=1 die Zeilen zu summieren, wird dies keine numerische Spalten ignorieren:

In [91]: 

df = pd.DataFrame({'a': [1,2,3], 'b': [2,3,4], 'c':['dd','ee','ff'], 'd':[5,9,1]}) 
df['e'] = df.sum(axis=1) 
df 
Out[91]: 
    a b c d e 
0 1 2 dd 5 8 
1 2 3 ee 9 14 
2 3 4 ff 1 8 

Wenn Sie nur bestimmte Spalten wollen zusammenzufassen, dann können Sie eine Liste der Spalten erstellen und entfernen diejenigen sind Sie nicht interessiert:

In [98]: 

col_list= list(df) 
col_list.remove('d') 
col_list 
Out[98]: 
['a', 'b', 'c'] 
In [99]: 

df['e'] = df[col_list].sum(axis=1) 
df 
Out[99]: 
    a b c d e 
0 1 2 dd 5 3 
1 2 3 ee 9 5 
2 3 4 ff 1 7 
+2

Ich habe die Frage bearbeitet, um eine bestimmte Liste von Spaltennamen zu haben :) Da es Spalten mit numerischen Werten geben könnte, möchte ich nicht summieren! –

+0

@EdChum Wie würde dies geschehen, wenn ich die Werte einiger Zeilen (abhängig von einer Bedingung) summieren und den anderen Zeilen den Summenwert 0 geben möchte? – Stanko

+0

@EdChum Ist es möglich, einzelne Spaltensummenwerte zu ersetzen, z. B. inf in 0 zu ändern oder die vorhandene Spaltensumme durch einen anderen Wert zu ersetzen? – toasteez

13

Wenn Sie nur ein paar Spalten zu summieren, können Sie schreiben:

df['e'] = df['a'] + df['b'] + df['d'] 

Dies schafft neue Spalte e mit den Werten:

a b c d e 
0 1 2 dd 5 8 
1 2 3 ee 9 14 
2 3 4 ff 1 8 

Für längere Listen von Spalten, EdChum Antwort ist bevorzugt.

+3

hallo, thks aber keine Antwort auf die Frage in einer Weise, dass, wenn ich 20 Spaltennamen haben, werde ich sicher nicht df.a + schreiben ... + df.t –

+0

(Very, sehr späte Antwort - Entschuldigung.) Das stimmt, Sie würden die von EdChum vorgeschlagene Methode für längere Spalten verwenden. Das heißt, das Schreiben von 'df.a + df.b' ist praktisch, wenn Sie nur ein paar Spalten zu summieren haben und syntaktisch klar sind. –

+0

Kennt jemand die Entsprechung für nicht numerische Spalten? – bowlby

0

Dies ist ein einfacher Weg ILoc mit wählen, welche Spalten zu summieren:

df['f']=df.iloc[:,0:2].sum(axis=1) 
df['g']=df.iloc[:,[0,1]].sum(axis=1) 
df['h']=df.iloc[:,[0,3]].sum(axis=1) 

Produziert:

a b c d e f g h 
0 1 2 dd 5 8 3 3 6 
1 2 3 ee 9 14 5 5 11 
2 3 4 ff 1 8 7 7 4 

ich nicht einen Weg zu kombinieren, um eine Reihe und bestimmte Spalten, die zum Beispiel arbeitet finden so etwas wie:

df['i']=df.iloc[:,[[0:2],3]].sum(axis=1) 
df['i']=df.iloc[:,[0:2,3]].sum(axis=1) 
Verwandte Themen