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?

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

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 .


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.