Python Pandas zählen und summieren bestimmte Bedingungen

73

Gibt es in Pandas einzelne Funktionen, um die Äquivalente von SUMIF auszuführen , die über eine bestimmte Bedingung summieren , und COUNTIF , das Werte bestimmter Bedingungen aus Excel zählt?

Ich weiß, dass es viele Mehrschrittfunktionen gibt, für die verwendet werden kann

zum Beispiel für sumifich kann (df.map(lambda x: condition), or df.size())dann verwenden.sum()

und denn countifich kann (groupby functionsmeine Antwort verwenden und suchen oder einen Filter und den verwenden.count())

Gibt es einen einfachen Ein-Schritt-Prozess, um diese Funktionen auszuführen, bei dem Sie die Bedingung und den Datenrahmen eingeben und die Summe oder die gezählten Ergebnisse erhalten?

user3084006
quelle

Antworten:

88

Sie können zunächst eine bedingte Auswahl treffen und die Ergebnisse der Auswahl mit der sumFunktion zusammenfassen.

>> df = pd.DataFrame({'a': [1, 2, 3]})
>> df[df.a > 1].sum()   
a    5
dtype: int64

Mehr als eine Bedingung haben:

>> df[(df.a > 1) & (df.a < 3)].sum()
a    2
dtype: int64
Jimmy C.
quelle
4
Was würden Sie tun, wenn Sie zwei oder mehr verschiedene Spalten haben und mehr als eine Bedingung möchten?
user3084006
Ändern Sie einfach eine der ausgewählten Spalten im zweiten Beispiel in einen anderen Spaltennamen.
Jimmy C
3
@ JimmyC: Ihre Antwort enthält Code für SUMIF, aber nicht COUNTIF, oder?
stackoverflowuser2010
3
@ stackoverflowuser2010 rechts. Wenn Sie COUNTIF machen möchten, ersetzen Sie einfach sum () durch count ()
Jimmy C
42

Sie haben die ausgefallenen Indizierungsfunktionen von Datenrahmen nicht erwähnt, z.

>>> df = pd.DataFrame({"class":[1,1,1,2,2], "value":[1,2,3,4,5]})
>>> df[df["class"]==1].sum()
class    3
value    6
dtype: int64
>>> df[df["class"]==1].sum()["value"]
6
>>> df[df["class"]==1].count()["value"]
3

Sie könnten df["class"]==1durch eine andere Bedingung ersetzen .

Thorsten Kranz
quelle
Ich habe dies auch in meinem Code, aber was ist, wenn Sie mehrere Bedingungen haben, wie wenn ich wollte df[df["class"]==1].count()["value"]und df[df["value"]==2].count()["class"]
user3084006
1
Die Kombination von mehr als einer Bedingung wurde von Jimmy C vorgeschlagen, daher werde ich sie in meinem Beitrag nicht wiederholen. Fehlt Ihnen noch etwas?
Thorsten Kranz
4
Ein einfacher Weg, um die Zählung zu bekommen, wärelen(df[df["class"]==1])
beldaz
7

Normalerweise verwende ich numpy sum über der logischen Bedingungsspalte:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'Age' : [20,24,18,5,78]})
>>> np.sum(df['Age'] > 20)
2

Dies scheint mir etwas kürzer als die oben vorgestellte Lösung

dan12345
quelle