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)) # DataFrameGroupByKrok 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: int64Krok łą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 180Iterowanie 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 220Typowe 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 1Grupowanie 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 340Model 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 fasterGroupBy 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 220Szybkie 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
- Wzorzec Split-Apply-Combine
- GroupBy z jednym i wieloma kluczami
- Metoda agg()
- Transformacja i filtrowanie GroupBy