2014-09-09 38 views
47

I mają następujące DataFrame:Pandy: suma DataFrame wierszy dla danej kolumny

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

ja do dodania do kolumny 'E', która jest sumą kolumnie 'a', 'b' i „d ".

Idąc wzdłuż forach, myślałem, coś jak to będzie działać:

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

Ale nie!

Chciałbym zrealizować operację z listą kolumn ['a','b','d'] i df jako danych wejściowych.

Odpowiedz

96

Można tylko sum i ustawić param axis=1 podsumować wiersze, to ignorować none kolumn numerycznych:

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 

Jeśli chcesz po prostu zsumować poszczególne kolumny następnie można utworzyć listę kolumn i usunąć te, które nie są zainteresowane:

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

Edytowałem pytanie, aby mieć określoną listę nazw kolorów :) Ponieważ mogą istnieć kolumny z wartościami liczbowymi, nie chcę ich sumować! –

+0

@EdChum Jak by to zrobić, gdybym chciał podsumować wartości niektórych wierszy (w zależności od warunku) i dać innym wierszom wartość sumy równą 0? – Stanko

+0

@EdChum Czy można zastąpić poszczególne wartości sumy kolumn np. Zmienić inf na 0 lub zastąpić istniejącą kolumnę razem inną wartością? – toasteez

13

Jeśli masz tylko kilka kolumn Podsumowując, można napisać:

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

To tworzy nową kolumnę e z wartościami:

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

na dłuższe listy kolumn, odpowiedź EdChum jest preferowane.

+3

hi, thks ale to nie jest odpowiedź na pytanie, w taki sposób, że jeśli mam 20 nazw kolumn, ja z pewnością nie pisać df.a + ... + df.t –

+0

(Very, bardzo późna odpowiedź - przeprosiny.) To prawda, używałbyś metody EdChum zasugerowanej dla dłuższych list kolumn. To powiedziawszy, pisanie 'df.a + df.b' jest wygodne, jeśli masz tylko kilka kolumn do podsumowania i jest zrozumiałe syntaktycznie. –

+0

Czy ktoś zna odpowiednik dla kolumn nieliczbowych? – bowlby

0

jest prostszy sposób korzystania iloc aby wybrać, które kolumny Podsumowując:

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) 

Produkuje:

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 

nie mogę znaleźć sposób, by połączyć szereg konkretnych i kolumny, które działa na przykład coś takiego:

df['i']=df.iloc[:,[[0:2],3]].sum(axis=1) 
df['i']=df.iloc[:,[0:2,3]].sum(axis=1) 
Powiązane problemy