Czy istnieje wbudowany sposób pandy do zastosowania dwóch różnych funkcji agregujących f1, f2
do tej samej kolumny df["returns"]
bez konieczności agg()
wielokrotnego wywoływania ?
Przykładowa ramka danych:
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)
})
Nieprawidłowy składniowo, ale intuicyjnie właściwy sposób na zrobienie tego to:
# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})
Oczywiście Python nie zezwala na zduplikowane klucze. Czy istnieje inny sposób wyrażenia wkładu agg()
? Może lista krotek [(column, function)]
działałaby lepiej, umożliwiając stosowanie wielu funkcji do tej samej kolumny? Ale agg()
wygląda na to, że akceptuje tylko słownik.
Czy istnieje obejście tego problemu poza zdefiniowaniem funkcji pomocniczej, która po prostu stosuje obie funkcje wewnątrz niej? (Jak to i tak działałoby z agregacją?)
Odpowiedzi:
Możesz po prostu przekazać funkcje jako listę:
lub jako słownik:
źródło
TLDR; Pandy
groupby.agg
ma nową, łatwiejszą składnię do określania (1) agregacji w wielu kolumnach i (2) wielu agregacji w kolumnie. Aby to zrobić dla pand> = 0,25 , użyjLUB
Pandy> = 0,25: nazwane agregacje
Pandy zmieniły zachowanie
GroupBy.agg
na rzecz bardziej intuicyjnej składni do określania nazwanych agregacji. Zobacz sekcję 0.25 docs dotyczącą ulepszeń, a także istotne problemy z GitHub GH18366 i GH26512 .Z dokumentacji,
Możesz teraz przekazać krotkę za pomocą argumentów słów kluczowych. Krotki mają format
(<colName>, <aggFunc>)
.Alternatywnie możesz użyć
pd.NamedAgg
(zasadniczo nazwanego tupli), co czyni rzeczy bardziej wyraźnymi.W przypadku Series jest to jeszcze prostsze, wystarczy przekazać funkcję aggfunc do argumentu słowa kluczowego.
Na koniec, jeśli nazwy kolumn nie są prawidłowymi identyfikatorami Pythona, użyj słownika z rozpakowywaniem:
Pandy <0,25
W nowszych wersjach pand prowadzących do 0,24, jeśli używasz słownika do określania nazw kolumn dla danych wyjściowych agregacji, otrzymasz
FutureWarning
:Używanie słownika do zmiany nazw kolumn jest przestarzałe w wersji 0.20. W nowszych wersjach pand można to określić prościej, przekazując listę krotek. Jeśli określasz funkcje w ten sposób, wszystkie funkcje dla tej kolumny muszą być określone jako krotki par (nazwa, funkcja).
Lub,
źródło
df.groupby('kind')['height']
?df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
Czy coś takiego jak ta praca:
źródło
aggregate
który wyraźnie mówi, że gdydict
przekazywane jest a , klucze muszą być nazwami kolumn. Więc albo twój przykład jest czymś, co wpisałeś bez sprawdzania tego błędu, albo Pandy psują tutaj swoje własne dokumenty.returns
. Więc to jest seria agregatów w wersji? Chcę wykonać agregację w wersji DataFrame i chcę jednocześnie zastosować kilka różnych agregacji do każdej kolumny.