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?
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, 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()
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
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.
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.
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())
.bTeil? Wie indizieren Sie die Spalten so?