Wie summiere ich mit Pandas Werte in einer Spalte, die einer bestimmten Bedingung entsprechen?

74

Angenommen, ich habe eine Spalte wie diese:

a   b  
1   5   
1   7
2   3
1   3
2   5

Ich möchte zum Beispiel die Werte für bwo zusammenfassen a = 1. Das würde mir geben 5 + 7 + 3 = 15.

Wie mache ich das bei Pandas?

adijo
quelle

Antworten:

122

Die wesentliche Idee hierbei ist, die Daten auszuwählen, die Sie summieren möchten, und sie dann zu summieren. Diese Auswahl von Daten kann auf verschiedene Arten erfolgen, von denen einige unten gezeigt werden.

Boolesche Indizierung

Die wahrscheinlich häufigste Methode zur Auswahl der Werte ist die Verwendung der Booleschen Indizierung .

Mit dieser Methode ermitteln Sie, wo die Spalte 'a' gleich ist, 1und summieren dann die entsprechenden Zeilen der Spalte 'b'. Sie können locdie Indizierung von Zeilen und Spalten verwenden:

>>> df.loc[df['a'] == 1, 'b'].sum()
15

Die Boolesche Indizierung kann auf andere Spalten erweitert werden. Wenn zum Beispiel dfauch eine Spalte 'c' enthalten wäre und wir die Zeilen in 'b' summieren wollten, wobei 'a' 1 und 'c' 2 war, würden wir schreiben:

df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()

Abfrage

Eine andere Möglichkeit, die Daten auszuwählen, besteht darin query, die gewünschten Zeilen zu filtern, die Spalte 'b' auszuwählen und dann zu summieren:

>>> df.query("a == 1")['b'].sum()
15

Auch hier kann die Methode erweitert werden, um eine kompliziertere Auswahl der Daten zu treffen:

df.query("a == 1 and c == 2")['b'].sum()

Beachten Sie, dass dies etwas prägnanter ist als der Boolesche Indizierungsansatz.

Gruppiere nach

Der alternative Ansatz besteht darin groupby, den DataFrame gemäß dem Wert in Spalte 'a' in Teile aufzuteilen. Sie können dann jedes Teil summieren und den Wert herausziehen, zu dem die Einsen addiert wurden:

>>> df.groupby('a')['b'].sum()[1]
15

Dieser Ansatz ist wahrscheinlich langsamer als die Verwendung der booleschen Indizierung. Er ist jedoch hilfreich, wenn Sie die Summen auf andere Werte in der Spalte überprüfen möchten a:

>>> df.groupby('a')['b'].sum()
a
1    15
2     8
Alex Riley
quelle
Was ist der .bTeil? Wie indizieren Sie die Spalten so?
Adijo
Sie können auf die Spalte ades DataFrame zugreifen, indem Sie df['a']oder schreiben df.a. Der zweite ist praktisch, funktioniert aber nicht gut, wenn Sie einen Spaltennamen mit mehreren Wörtern wie "Personen-ID" haben oder wenn der Spaltenname mit einer DataFrame-Methode wie "Wo" oder "Summe" übereinstimmt.
Alex Riley
Ok, danke, auch wie konvertiere ich alle Werte in der Spalte in eine, intdamit ich sie summieren kann? Ich habe benutztmap alle konvertiert, intsaber ich denke, es gibt möglicherweise eine eingebaute Funktion in Pandas, um dies effizienter zu tun.
Adijo
1
Du könntest schreiben df['a'] = df['a'].astype(int)oder df['a'] = df['a'].convert_objects(convert_numeric=True)das tun.
Alex Riley
3
@ LucSpan: Absolut, Sie können schreiben, df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()um die Werte zu summieren.
Alex Riley
2

Sie können dies auch tun, ohne groupby oder loc zu verwenden. Durch einfaches Einfügen der Bedingung in den Code. Der Name des Datenrahmens sei df. Dann können Sie versuchen:

df[df['a']==1]['b'].sum()

oder Sie können auch versuchen:

sum(df[df['a']==1]['b'])

Eine andere Möglichkeit könnte darin bestehen, die numpy-Bibliothek von Python zu verwenden:

import numpy as np
print(np.where(df['a']==1, df['b'],0).sum())
Himanshu Poddar
quelle