0Pricing
Pandas & NumPy Academy · Lekcja

Wzorzec Split-Apply-Combine

Poznaj koncepcyjny przebieg groupby: dzielenie DataFrame na grupy, zastosowanie funkcji i połączenie wyników.

Wzorzec Split-Apply-Combine to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 1 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.

Czym jest GroupBy?

Operacja GroupBy jest jednym z najpotężniejszych wzorców stosowanych w analizie danych. Pozwala podzielić obiekt DataFrame na grupy, niezależnie zastosować funkcję do każdej grupy, a następnie połączyć wyniki w nową strukturę. Ten sposób pracy jest znany jako wzorzec dziel-zastosuj-połącz (split-apply-combine) — termin ten ukuł statystyk Hadley Wickham.

Krok dzielenia

W kroku dzielenia Pandas dzieli obiekt DataFrame na podrzędne obiekty DataFrame na podstawie unikatowych wartości w jednej lub kilku kolumnach. Jeśli na przykład dane zawierają kolumnę region z wartościami takimi jak 'North', 'South' i 'West', krok dzielenia tworzy trzy odrębne grupy. Na tym etapie żadne dane nie są jeszcze przenoszone ani kopiowane — Pandas jedynie rejestruje, które wiersze należą do poszczególnych grup.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'North', 'West', 'South'],
    'sales': [200, 150, 300, 180, 220]
})

# split: create a GroupBy object
grouped = df.groupby('region')
print(type(grouped))  # DataFrameGroupBy

Krok zastosowania

W kroku zastosowania funkcja jest stosowana niezależnie do każdej grupy. Może to być wbudowana funkcja agregująca, taka jak sum() lub mean(), albo własna zdefiniowana przez Państwa. Wiersze każdej grupy są przekazywane do funkcji, która zwraca skalar, obiekt Series lub DataFrame jako wynik.

# apply: compute the sum of 'sales' within each region group
total_sales = grouped['sales'].sum()
print(total_sales)
# region
# North    500
# South    370
# West     180
# Name: sales, dtype: int64

Krok łączenia

W kroku łączenia Pandas automatycznie zestawia wyniki poszczególnych grup z powrotem w jeden obiekt — zazwyczaj Series lub DataFrame. Klucze grup stają się indeksem wyniku. Ten krok odbywa się niewidocznie podczas wywoływania metody agregującej na obiekcie GroupBy, dzięki czemu otrzymują Państwo przejrzystą tabelę podsumowania z jednym wierszem na grupę.

# combine happens automatically — result is a Series indexed by 'region'
print(total_sales.index)   # Index(['North', 'South', 'West'])
print(total_sales.values)  # [500, 370, 180]

Tworzenie obiektu GroupBy

Obiekt GroupBy tworzy się przez wywołanie df.groupby(column). Na tym etapie nie są wykonywane żadne obliczenia — jest to obiekt leniwie obliczany. Można go iterować, aby wyświetlić grupy, albo połączyć z metodą agregującą, aby uruchomić obliczenia. Przekazanie as_index=False pozostawia kolumnę grupowania jako zwykłą kolumnę zamiast indeksu w wyniku.

grouped = df.groupby('region', as_index=False)
result = grouped['sales'].sum()
print(result)
#   region  sales
# 0  North    500
# 1  South    370
# 2   West    180

Iterowanie po grupach

Można iterować po obiekcie GroupBy, aby analizować każdą grupę osobno. W każdej iteracji zwracana jest krotka (group_key, sub_dataframe). Jest to przydatne podczas debugowania lub wtedy, gdy chcą Państwo przetwarzać każdą grupę za pomocą dowolnego kodu Python. Jednak ze względów wydajnościowych w środowisku produkcyjnym należy preferować wektoryzowane metody agregujące zamiast jawnego iterowania.

for name, group in df.groupby('region'):
    print(f'--- {name} ---')
    print(group)
# --- North ---
#   region  sales
# 0  North    200
# 2  North    300
# --- South ---
#   region  sales
# 1  South    150
# 4  South    220

Typowe funkcje agregujące

GroupBy w Pandas obsługuje wiele wbudowanych funkcji agregujących: sum(), mean(), count(), min(), max(), std(), median() i inne. Są one wysoko zoptymalizowane i przetwarzają wszystkie grupy w jednym przebiegu. Gdy istnieje odpowiednia funkcja wbudowana, należy zawsze preferować ją zamiast pisania własnej funkcji w Pythonie.

print(df.groupby('region')['sales'].mean())
# region
# North    250.0
# South    185.0
# West     180.0

print(df.groupby('region')['sales'].count())
# region
# North    2
# South    2
# West     1

Grupowanie wielu kolumn jednocześnie

Agregacje można stosować jednocześnie do wielu kolumn, wybierając je przed wywołaniem metody agregującej albo pomijając wybór kolumn, aby agregować wszystkie kolumny numeryczne. Wynikiem jest DataFrame zamiast Series, z jedną kolumną dla każdej agregowanej zmiennej.

df2 = pd.DataFrame({
    'region': ['North', 'South', 'North', 'South'],
    'units': [10, 8, 12, 9],
    'revenue': [200, 160, 240, 180]
})

print(df2.groupby('region').sum())
#         units  revenue
# region
# North      22      440
# South      17      340

Model mentalny GroupBy

Warto myśleć o GroupBy jak o klauzuli GROUP BY w SQL. Kod Pandas df.groupby('region')['sales'].sum() jest odpowiednikiem zapytania SELECT region, SUM(sales) FROM df GROUP BY region w SQL. Zrozumienie tego podobieństwa ułatwia przechodzenie między tymi dwoma narzędziami i wybór odpowiedniej abstrakcji dla potoku przetwarzania.

# Pandas GroupBy is equivalent to SQL GROUP BY
# SQL:    SELECT region, SUM(sales) FROM df GROUP BY region
# Pandas: df.groupby('region')['sales'].sum()

result = df.groupby('region')['sales'].sum().reset_index()
result.columns = ['region', 'total_sales']
print(result)

Dlaczego nie użyć pętli?

Mogą się Państwo zastanawiać, dlaczego po prostu nie iterować po unikatowych wartościach i nie obliczać statystyk ręcznie. Odpowiedź brzmi: wydajność i czytelność. Pętla Python po grupach jest znacznie wolniejsza niż pojedyncze wektoryzowane wywołanie groupby, szczególnie w przypadku dużych zbiorów danych. Operacje GroupBy działają wewnętrznie w skompilowanym kodzie C, dzięki czemu są od 10 do 100 razy szybsze niż równoważne pętle w Pythonie.

# Slow approach with a loop
results = {}
for region in df['region'].unique():
    subset = df[df['region'] == region]
    results[region] = subset['sales'].sum()

# Fast approach with GroupBy
results_fast = df.groupby('region')['sales'].sum().to_dict()
# Both give the same answer, but GroupBy is orders of magnitude faster

GroupBy z wieloma kluczami grupowania

Gdy potrzebna jest większa szczegółowość, można grupować według wielu kolumn, przekazując listę do groupby(). Wynik zawiera indeks MultiIndex, w którym każdy poziom odpowiada jednej kolumnie grupowania. Na przykład grupowanie jednocześnie według 'region' i 'quarter' daje sumy dla każdej kombinacji regionu i kwartału.

df3 = pd.DataFrame({
    'region': ['North', 'North', 'South', 'South'],
    'quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
    'sales': [200, 300, 150, 220]
})

print(df3.groupby(['region', 'quarter'])['sales'].sum())
# region  quarter
# North   Q1         200
#         Q2         300
# South   Q1         150
#         Q2         220

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat wzorca dziel-zastosuj-połącz z tej lekcji.

Podsumowanie lekcji

W tej lekcji poznali Państwo: wzorzec dziel-zastosuj-połącz, na którym opierają się wszystkie operacje GroupBy, sposób tworzenia obiektu GroupBy za pomocą df.groupby() oraz stosowanie wbudowanych agregacji, takich jak sum() i mean(), aby uzyskać jeden wynik dla każdej grupy. Następnie omówimy grupowanie według pojedynczych i wielu kluczy oraz kolejne metody agregujące.

Często zadawane pytania

Czy lekcja „Wzorzec Split-Apply-Combine” jest bezpłatna?

Tak — pełny tekst „Wzorzec Split-Apply-Combine” 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 „Wzorzec Split-Apply-Combine”?

Poznaj koncepcyjny przebieg groupby: dzielenie DataFrame na grupy, zastosowanie funkcji i połączenie wyników. Ć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 1 z 4.

Ile czasu zajmuje lekcja „Wzorzec Split-Apply-Combine”?

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