Beispieldatensatz (Ausgabe ist das gewünschte Ergebnis).
Code: Select all
idx week slug valuation output
0 2 slouk -4 12.00
1 3 slouk 7 4.00
2 4 slouk 8 5.00
3 3 kenun 10 14.00
4 1 kenun 11
5 1 slouk 12
6 2 kenun 17 11.00
7 4 kenun 21 12.67
Code: Select all
# chaining
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.shift()
.expanding()
.mean()
.reset_index(drop=True)
)
# apply
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.apply(lambda x: x.shift().expanding().mean())
.reset_index(drop=True)
)
So, jetzt das Es funktioniert:
Code: Select all
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.apply(lambda x: x.shift().expanding().mean())
.sort_index(level=1)
.reset_index(drop=True)
)
Obwohl es funktioniert, habe ich immer noch einige Punkte, die ich Ich möchte es besser verstehen:
- Problem mit der Verkettung von Methoden: Wenn ich Methodenverkettung wie z td.groupby('slug')['valuation'].shift().expanding().mean() scheint ab einem bestimmten Punkt den Überblick über die Gruppierung zu verlieren. Ich frage mich, warum das passiert und wie es sich von der Verwendung von „Apply“ unterscheidet.
- Indizierung und Zuweisung mit „Apply“: „Apply“ mit einer Lambda-Funktion verwenden führt den Vorgang korrekt aus, aber die resultierende Serie hat eine andere Reihenfolge als mein ursprünglicher DataFrame. Wenn ich versuche, es mit .reset_index(drop=True) wieder zuzuweisen, werden die Dinge nicht richtig ausgerichtet. Ich suche Klarheit darüber, wie dieser Neuzuweisungsprozess funktioniert.
- Gibt es eine andere, effizientere Möglichkeit, das zu tun, was ich suche?< /p>