2014-09-09 38 views
47

ho la seguente dataframe:Pandas: somma dataframe righe per le varie colonne

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

Vorrei aggiungere una colonna 'e' che è la somma di colonna 'a', 'b' e 'd '.

Attraversando forum, ho pensato che qualcosa di simile potrebbe funzionare:

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

Ma no!

Mi piacerebbe realizzare l'operazione con l'elenco delle colonne ['a','b','d'] e df come input.

risposta

96

Si può solo sum e impostare param axis=1 per sommare le righe, questo ignorerà nessuno colonne numeriche:

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 

Se si desidera sommare solo le colonne specifiche quindi è possibile creare un elenco delle colonne e rimuovere quelli che non si sono interessati:

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

Ho modificato la domanda per avere una lista specifica di nomi di colonna :) Poiché potrebbero esserci colonne con valori numerici, non voglio sommare! –

+0

@EdChum Come si farebbe questo se volessi sommare i valori di alcune righe (a seconda di una condizione) e dare alle altre righe un valore di somma di 0? – Stanko

+0

@EdChum È possibile sostituire i singoli valori di somma delle colonne, ad esempio, cambiare inf a 0 o sostituire il totale di colonne esistente con un valore diverso? – toasteez

13

Se si dispone di pochi colonne per riassumere, si può scrivere:

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

Questo crea nuova colonna e con i valori:

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

Per gli elenchi più lunghi di colonne, la risposta di EdChum è preferito.

+3

hi, thks ma questo non risponde alla domanda in un modo che se ho 20 nomi di colonna, io certamente non scrivere df.a + ... + df.t –

+0

(Molto, risposta molto tardiva - scuse.) È vero, si userebbe il metodo proposto da EdChum per elenchi di colonne più lunghi. Detto questo, scrivere 'df.a + df.b' è conveniente se si hanno solo poche colonne da sommare ed è sintatticamente chiaro. –

+0

Qualcuno conosce l'equivalente per le colonne non numeriche? – bowlby

0

si tratta di un modo più semplice usando iLOC per selezionare le colonne per riassumere:

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) 

produce:

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 

non riesco a trovare un modo per combinare una serie di colonne specifiche che funziona per esempio qualcosa di simile:

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