Gibt es eine integrierte Pandas-Methode, um zwei verschiedene Aggregationsfunktionen f1, f2
auf dieselbe Spalte anzuwenden df["returns"]
, ohne agg()
mehrmals aufrufen zu müssen ?
Beispieldatenrahmen:
import pandas as pd
import datetime as dt
pd.np.random.seed(0)
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
Der syntaktisch falsche, aber intuitiv richtige Weg wäre:
# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})
Offensichtlich erlaubt Python keine doppelten Schlüssel. Gibt es eine andere Art und Weise zum Ausdrücken des Eingangs agg()
? Vielleicht würde eine Liste von Tupeln [(column, function)]
besser funktionieren, um mehrere Funktionen auf dieselbe Spalte anzuwenden? Aber es agg()
scheint, als würde es nur ein Wörterbuch akzeptieren.
Gibt es dafür eine Problemumgehung, außer eine Hilfsfunktion zu definieren, die nur beide darin enthaltenen Funktionen anwendet? (Wie würde das überhaupt mit Aggregation funktionieren?)
Antworten:
Sie können die Funktionen einfach als Liste übergeben:
oder als Wörterbuch:
quelle
TLDR; Pandas
groupby.agg
verfügt über eine neue, einfachere Syntax zum Festlegen von (1) Aggregationen in mehreren Spalten und (2) mehreren Aggregationen in einer Spalte. Um dies für Pandas> = 0,25 zu tun , verwenden SieODER
Pandas> = 0,25: Benannte Aggregation
Pandas hat das Verhalten
GroupBy.agg
zugunsten einer intuitiveren Syntax für die Angabe benannter Aggregationen geändert . Weitere Informationen finden Sie im Abschnitt zu den 0,25-Dokumenten zu Verbesserungen sowie zu den relevanten GitHub-Problemen GH18366 und GH26512 .Aus der Dokumentation,
Sie können jetzt ein Tupel über Schlüsselwortargumente übergeben. Die Tupel folgen dem Format von
(<colName>, <aggFunc>)
.Alternativ können Sie
pd.NamedAgg
(im Wesentlichen ein benanntes Tupel) verwenden, um die Dinge expliziter zu machen.Für Serien ist es noch einfacher. Übergeben Sie die aggfunc einfach an ein Schlüsselwortargument.
Wenn Ihre Spaltennamen keine gültigen Python-IDs sind, verwenden Sie ein Wörterbuch mit dem Entpacken:
Pandas <0,25
Wenn Sie in neueren Versionen von Pandas bis zu 0,24 ein Wörterbuch zum Festlegen von Spaltennamen für die Aggregationsausgabe verwenden, erhalten Sie Folgendes
FutureWarning
:Die Verwendung eines Wörterbuchs zum Umbenennen von Spalten ist in Version 0.20 veraltet. Bei neueren Versionen von Pandas kann dies einfacher angegeben werden, indem eine Liste von Tupeln übergeben wird. Wenn Sie die Funktionen auf diese Weise angeben , müssen alle Funktionen für diese Spalte als Tupel von (Name, Funktion) Paaren angegeben werden.
Oder,
quelle
df.groupby('kind')['height']
?df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
Würde so etwas funktionieren:
quelle
aggregate
heißt es explizit, dassdict
die Schlüssel bei der Übergabe von a Spaltennamen sein müssen. Entweder haben Sie Ihr Beispiel eingegeben, ohne nach diesem Fehler zu suchen, oder Pandas bricht hier seine eigenen Dokumente.returns
dort nicht gesehen. Das ist also die Serienversion von Aggregat? Ich möchte die DataFrame-Version des Aggregats erstellen und mehrere verschiedene Aggregationen gleichzeitig auf jede Spalte anwenden.