0Pricing
Pandas & NumPy Academy · Lekcja

Metoda agg()

Zastosuj jednocześnie wiele funkcji agregujących za pomocą agg() i przekaż słownik, aby obliczyć różne statystyki dla różnych kolumn.

Metoda agg() to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Dlaczego używać agg()?

Bezpośrednie wywołanie sum() lub mean() na obiekcie GroupBy daje jedną statystykę. Jednak rzeczywiste analizy często wymagają wielu statystyk jednocześnie — na przykład łącznego przychodu, średniej wartości zamówienia i liczby zamówień dla każdego regionu. Metoda agg() (skrót od aggregate) pozwala obliczyć je wszystkie w jednym wydajnym wywołaniu, zamiast wykonywać osobne agregacje i scalać wyniki.

Przekazywanie listy nazw funkcji

Najprostsze użycie agg() polega na przekazaniu listy ciągów znaków zawierających nazwy funkcji. Pandas stosuje każdą funkcję do wybranej kolumny i zwraca DataFrame, w którym każda kolumna odpowiada jednej funkcji. To podejście działa z dowolną wbudowaną nazwą agregacji: 'sum', 'mean', 'min', 'max', 'count', 'std', 'median' i innymi.

import pandas as pd

df = pd.DataFrame({
    'region': ['East', 'West', 'East', 'West', 'East', 'West'],
    'revenue': [200, 340, 150, 290, 310, 410],
    'units':   [20,   35,  15,  30,  28,  40]
})

result = df.groupby('region')['revenue'].agg(['sum', 'mean', 'count', 'max'])
print(result)
#          sum        mean  count  max
# region
# East     660  220.000000      3  310
# West    1040  346.666667      3  410

Zmiana nazw kolumn wynikowych za pomocą agregacji nazwanych

Po przekazaniu listy ciągów znaków kolumny wynikowe otrzymują nazwy odpowiadające samym funkcjom ('sum', 'mean' itd.). Aby uzyskać czytelniejszy wynik, należy użyć agregacji nazwanych: przekazać argumenty słów kluczowych, w których klucz jest żądaną nazwą kolumny, a wartość — krotką (column, function). Jest to nowoczesne podejście w Pandas, które tworzy kod samodokumentujący się.

result = df.groupby('region').agg(
    total_revenue=('revenue', 'sum'),
    avg_revenue=('revenue', 'mean'),
    order_count=('revenue', 'count'),
    max_order=('revenue', 'max')
)
print(result)
#         total_revenue  avg_revenue  order_count  max_order
# region
# East              660   220.000000            3        310
# West             1040   346.666667            3        410

Różne funkcje dla różnych kolumn

Do agg() można przekazać słownik, w którym każdy klucz jest nazwą kolumny, a każda wartość — funkcją (lub listą funkcji) stosowaną do tej kolumny. Pozwala to na przykład obliczyć sum dla revenue, a mean dla units, w jednym wywołaniu GroupBy.

result = df.groupby('region').agg({
    'revenue': ['sum', 'mean'],
    'units':   ['sum', 'max']
})
print(result)
#        revenue             units
#            sum        mean   sum max
# region
# East       660  220.000000    63  28
# West      1040  346.666667   105  40

MultiIndex kolumn z dict agg()

Po przekazaniu słownika z wieloma funkcjami dla jednej kolumny wynik zawiera MultiIndex kolumn. Pierwszy poziom to pierwotna nazwa kolumny, a drugi — nazwa funkcji. Nazwy kolumn można spłaszczyć do pojedynczego ciągu znaków za pomocą list comprehension, co ułatwia dalszą pracę z wynikiem.

result = df.groupby('region').agg({'revenue': ['sum', 'mean'], 'units': 'sum'})

# Flatten MultiIndex columns
result.columns = ['_'.join(c).strip() for c in result.columns]
print(result.columns.tolist())
# ['revenue_sum', 'revenue_mean', 'units_sum']

Używanie własnych funkcji w agg()

Oprócz nazw w postaci ciągów znaków można przekazać do agg() dowolny obiekt wywoływalny języka Python. Funkcja otrzymuje obiekt Series (wartości dla danej kolumny w jednej grupie) i musi zwrócić skalar. Można przekazać funkcję lambda lub funkcję nazwaną. Funkcje własne są bardziej elastyczne, ale wolniejsze od wbudowanych funkcji przekazanych z użyciem nazw, ponieważ nie mogą korzystać z optymalizacji na poziomie C.

def revenue_range(s):
    return s.max() - s.min()

result = df.groupby('region')['revenue'].agg(['sum', revenue_range])
print(result)
#          sum  revenue_range
# region
# East     660            160
# West    1040            120

Agregacje nazwane z funkcjami własnymi

Składnia nazwanych agregacji działa również z funkcjami wywoływalnymi, a nie tylko z nazwami zapisanymi jako ciągi znaków. Wystarczy przekazać krotkę (column, function) jako wartość argumentu słowa kluczowego, gdzie funkcja jest dowolnym obiektem wywoływalnym, który przyjmuje Series i zwraca wartość skalarną. Dzięki temu kod pozostaje czytelny nawet wtedy, gdy łączą Państwo funkcje wbudowane z własną logiką.

result = df.groupby('region').agg(
    total=('revenue', 'sum'),
    spread=('revenue', lambda s: s.max() - s.min()),
    top_units=('units', 'max')
)
print(result)
#         total  spread  top_units
# region
# East      660     160         28
# West     1040     120         40

Agregowanie bez wybierania kolumny

Gdy wywołują Państwo agg() na obiekcie GroupBy bez wybierania konkretnej kolumny, Pandas stosuje funkcję do każdej kolumny numerycznej w DataFrame. To szybki sposób na uzyskanie podsumowania wszystkich kolumn numerycznych jednocześnie. Należy pamiętać, że kolumny z nienumerycznymi typami danych są w większości agregacji pomijane bez ostrzeżenia.

# Aggregate all numeric columns in one call
result = df.groupby('region').agg(['sum', 'mean'])
print(result)
#        revenue              units
#            sum        mean    sum   mean
# region
# East       660  220.000000     63  21.00
# West      1040  346.666667    105  35.00

Łączenie agg() z reset_index()

Po wywołaniu agg() kolumny grupowania stają się indeksem. Często stosuje się wzorzec polegający na natychmiastowym wywołaniu reset_index(), aby uzyskać płaski DataFrame, w którym klucze grup są zwykłymi kolumnami. Następnie można zmieniać nazwy, sortować i filtrować wynik tak jak każdy inny DataFrame, co ułatwia przekazanie go do kolejnych etapów przetwarzania lub eksport.

summary = (
    df.groupby('region')
      .agg(total=('revenue', 'sum'), orders=('revenue', 'count'))
      .reset_index()
      .sort_values('total', ascending=False)
)
print(summary)
#   region  total  orders
# 1   West   1040       3
# 0   East    660       3

agg() a transform() i apply()

Ważne jest rozróżnienie trzech metod GroupBy: agg() redukuje każdą grupę do wartości skalarnej, tworząc wynik z mniejszą liczbą wierszy niż oryginał. transform() zwraca tablicę o takim samym kształcie jak dane wejściowe, dzięki czemu można dodać statystyki na poziomie grup jako nowe kolumny. apply() jest najbardziej elastyczna, ale również najwolniejsza; zostanie omówiona w następnej lekcji.

# agg: one row per group
print(df.groupby('region')['revenue'].agg('mean'))
# region
# East    220.0
# West    346.7

# transform: one row per original row (group mean broadcast back)
df['group_mean'] = df.groupby('region')['revenue'].transform('mean')
print(df[['region', 'revenue', 'group_mean']].head())

Praktyczny przykład: podsumowanie sprzedaży

Oto realistyczny przykład obejmujący cały proces: obliczenie tabeli podsumowania sprzedaży zawierającej łączny przychód, średnią wartość zamówienia, liczbę zamówień oraz zakres przychodów dla każdego regionu, z czytelnymi nazwami kolumn i sortowaniem malejąco według łącznego przychodu. Ten wzorzec można bezpośrednio zastosować w procesach analitycznych dotyczących produktu, finansów i marketingu.

summary = (
    df.groupby('region')
      .agg(
          total_revenue=('revenue', 'sum'),
          avg_order=('revenue', 'mean'),
          num_orders=('revenue', 'count'),
          revenue_range=('revenue', lambda s: s.max() - s.min())
      )
      .reset_index()
      .sort_values('total_revenue', ascending=False)
      .round(2)
)
print(summary)

Szybkie sprawdzenie

Sprawdź swoje zrozumienie metody agg() omówionej w tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, jak obliczać wiele agregacji jednocześnie za pomocą agg(), jak używać nazwanych agregacji do tworzenia czytelnych nazw kolumn oraz jak stosować różne funkcje do różnych kolumn za pomocą słownika. Następnie omówimy transform() i filter(), które dodają informacje na poziomie grup z powrotem do oryginalnego DataFrame.

Często zadawane pytania

Czy lekcja „Metoda agg()” jest bezpłatna?

Tak — pełny tekst „Metoda agg()” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Metoda agg()”?

Zastosuj jednocześnie wiele funkcji agregujących za pomocą agg() i przekaż słownik, aby obliczyć różne statystyki dla różnych kolumn. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Metoda agg()”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wzorzec Split-Apply-Combine
  2. GroupBy z jednym i wieloma kluczami
  3. Metoda agg()
  4. Transformacja i filtrowanie GroupBy
← Powrót do Pandas & NumPy Academy