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.