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 b
wo zusammenfassen a = 1
. Das würde mir geben 5 + 7 + 3 = 15
.
Wie mache ich das bei Pandas?
Antworten:
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.
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, 1
und summieren dann die entsprechenden Zeilen der Spalte 'b'. Sie können loc
die 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 df
auch 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()
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.
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
a
des 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.
int
damit ich sie summieren kann? Ich habe benutztmap
alle konvertiert, ints
aber ich denke, es gibt möglicherweise eine eingebaute Funktion in Pandas, um dies effizienter zu tun.
df['a'] = df['a'].astype(int)
oder df['a'] = df['a'].convert_objects(convert_numeric=True)
das tun.
df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()
um die Werte zu summieren.
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())
.b
Teil? Wie indizieren Sie die Spalten so?