GroupBy z jednym i wieloma kluczami
Grupuj dane według jednej lub wielu kolumn za pomocą groupby() i stosuj agregacje sum, mean, count oraz min/max.
GroupBy z jednym i wieloma kluczami to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 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.
GroupBy z pojedynczym kluczem
Najprostsze wywołanie GroupBy używa pojedynczej kolumny jako klucza grupowania. Wywołują Państwo df.groupby('column_name') i łączą je z agregacją. Pandas tworzy jedną grupę dla każdej unikatowej wartości w tej kolumnie i stosuje agregację do każdej kolumny numerycznej (lub wybranej kolumny). Jest to najczęściej spotykana forma GroupBy w codziennej analizie.
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'HR', 'Eng', 'HR', 'Eng'],
'salary': [90000, 60000, 95000, 62000, 88000],
'years': [3, 5, 7, 2, 4]
})
print(df.groupby('dept')['salary'].mean())
# dept
# Eng 91000.0
# HR 61000.0Wybór kolumn do agregacji
Po wywołaniu groupby() można wybrać jedną kolumnę za pomocą notacji nawiasowej, aby uzyskać obiekt SeriesGroupBy, albo wiele kolumn za pomocą listy, aby uzyskać obiekt DataFrameGroupBy. Jeśli wybór zostanie całkowicie pominięty, Pandas agreguje wszystkie kolumny numeryczne. Jest to wygodne, ale może prowadzić do nieoczekiwanych wyników, gdy dane zawierają nieistotne kolumny numeryczne.
# Single column result -> SeriesGroupBy
print(df.groupby('dept')['salary'].sum())
# Multiple columns result -> DataFrameGroupBy
print(df.groupby('dept')[['salary', 'years']].mean())
# salary years
# dept
# Eng 91000.0 4.667
# HR 61000.0 3.500Wszystkie typowe agregacje
Pandas obsługuje pełny zestaw wbudowanych metod agregujących dla obiektów GroupBy: sum(), mean(), median(), min(), max(), count(), std(), var(), first() i last(). Każda z nich zwraca skalar dla każdej grupy, zapewniając przejrzystą tabelę podsumowania z indeksem opartym na kluczu grupowania.
g = df.groupby('dept')['salary']
print('sum: ', g.sum())
print('mean: ', g.mean())
print('min: ', g.min())
print('max: ', g.max())
print('count: ', g.count())
print('std: ', g.std().round(2))GroupBy z wieloma kluczami
Przekaż listę nazw kolumn do groupby(), aby jednocześnie grupować według więcej niż jednego wymiaru. Każda unikatowa kombinacja wartości w tych kolumnach staje się osobną grupą. Wynik zawiera MultiIndex z jednym poziomem dla każdej kolumny grupowania, co pozwala w jednym kroku analizować podsumowania wielowymiarowe.
df2 = pd.DataFrame({
'dept': ['Eng', 'Eng', 'HR', 'HR', 'Eng', 'HR'],
'level': ['L1', 'L2', 'L1', 'L2', 'L1', 'L1'],
'salary': [80000, 100000, 55000, 70000, 82000, 58000]
})
result = df2.groupby(['dept', 'level'])['salary'].mean()
print(result)
# dept level
# Eng L1 81000.0
# L2 100000.0
# HR L1 56500.0
# L2 70000.0Dostęp do wyników MultiIndex
Podczas grupowania według wielu kluczy indeks wyniku jest obiektem MultiIndex. Do określonego poziomu zewnętrznego można uzyskać dostęp za pomocą .loc['value'], a po poziomach wewnętrznych poruszać się za pomocą krotek. Wywołanie reset_index() spłaszcza MultiIndex do postaci zwykłych kolumn, co często ułatwia dalsze operacje lub eksport.
result = df2.groupby(['dept', 'level'])['salary'].mean()
# Access Engineering rows only
print(result.loc['Eng'])
# level
# L1 81000.0
# L2 100000.0
# Flatten to a regular DataFrame
print(result.reset_index())
# dept level salary
# 0 Eng L1 81000.0
# 1 Eng L2 100000.0Używanie as_index=False
Domyślnie kolumny grupowania stają się indeksem wyniku. Przekazanie as_index=False pozostawia je jako zwykłe kolumny, zapewniając płaski DataFrame, który łatwiej przekazać do kolejnych operacji Pandas lub wyeksportować. Odpowiada to wywołaniu reset_index() na wyniku.
flat = df2.groupby(['dept', 'level'], as_index=False)['salary'].mean()
print(flat)
# dept level salary
# 0 Eng L1 81000.0
# 1 Eng L2 100000.0
# 2 HR L1 56500.0
# 3 HR L2 70000.0Zliczanie wierszy w każdej grupie
count() zwraca liczbę wartości niebędących wartościami null w każdej grupie. Jeśli chcą Państwo uzyskać całkowitą liczbę wierszy w grupie, niezależnie od wartości null, należy użyć zamiast tego size(). To rozróżnienie ma znaczenie, gdy dane zawierają braki, ponieważ count() zaniży liczebność grup zawierających wpisy NaN.
import numpy as np
df3 = pd.DataFrame({
'dept': ['Eng', 'Eng', 'HR', 'HR'],
'bonus': [5000, np.nan, 3000, 4000]
})
print(df3.groupby('dept')['bonus'].count()) # ignores NaN
# dept
# Eng 1
# HR 2
print(df3.groupby('dept')['bonus'].size()) # includes NaN rows
# dept
# Eng 2
# HR 2Sortowanie wyników GroupBy
Domyślnie GroupBy sortuje wynik według klucza grupy. Sortowanie można wyłączyć za pomocą sort=False, aby zachować pierwotną kolejność pierwszego wystąpienia; w przypadku dużych zbiorów danych jest to nieco szybsze. Gdy wynik jest już obiektem DataFrame, można posortować go dodatkowo według dowolnej kolumny za pomocą sort_values().
result = (df.groupby('dept', sort=False)['salary']
.mean()
.reset_index()
.sort_values('salary', ascending=False))
print(result)
# dept salary
# 0 Eng 91000.0
# 1 HR 61000.0Łączenie GroupBy z innymi metodami
Wyniki GroupBy są zwykłymi obiektami Series lub DataFrame, dlatego można od razu łączyć je z kolejnymi metodami Pandas. Typowy wzorzec polega na agregacji, następnie wywołaniu reset_index(), zmianie nazw kolumn i wywołaniu sort_values() — wszystko w jednym czytelnym łańcuchu metod, bez przechowywania zmiennych pośrednich.
summary = (
df
.groupby('dept')['salary']
.agg(['mean', 'count'])
.rename(columns={'mean': 'avg_salary', 'count': 'headcount'})
.reset_index()
.sort_values('avg_salary', ascending=False)
)
print(summary)Jednoczesne stosowanie sum, mean i count
Często potrzebują Państwo więcej niż jednej statystyki dla każdej grupy. Przekazanie listy nazw funkcji do .agg() pozwala obliczyć kilka statystyk jednocześnie. Wynikiem jest DataFrame z osobną kolumną dla każdej funkcji. Jest to wydajniejsze niż wywoływanie każdej agregacji osobno, ponieważ Pandas przetwarza je wszystkie w jednym przebiegu danych.
result = df.groupby('dept')['salary'].agg(['sum', 'mean', 'count', 'max'])
print(result)
# sum mean count max
# dept
# Eng 273000 91000.0 3 95000
# HR 122000 61000.0 2 62000Grupowanie według kolumn kategorycznych
Gdy kolumna grupowania ma typ danych Categorical, Pandas domyślnie uwzględnia w wyniku wszystkie kategorie, nawet te, które nie zawierają żadnych wierszy. Może to być przydatne, aby tabela podsumowania zawsze pokazywała każdą kategorię, ale tworzy wiersze z wartościami NaN lub 0 dla pustych grup. Można sterować tym za pomocą parametru observed (ustawienie True pomija puste kategorie).
df['dept'] = df['dept'].astype('category')
# With observed=True, only groups that appear in data are included
print(df.groupby('dept', observed=True)['salary'].mean())
# dept
# Eng 91000.0
# HR 61000.0Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat GroupBy z pojedynczymi i wieloma kluczami z tej lekcji.
Podsumowanie lekcji
W tej lekcji poznali Państwo: grupowanie według pojedynczej kolumny i stosowanie typowych agregacji, grupowanie według wielu kolumn w celu tworzenia podsumowań wielowymiarowych oraz różnicę między count() i size(), gdy występują wartości null. Następnie omówimy potężną metodę agg(), służącą do obliczania wielu różnych statystyk w jednym wywołaniu.
Często zadawane pytania
Czy lekcja „GroupBy z jednym i wieloma kluczami” jest bezpłatna?
Tak — pełny tekst „GroupBy z jednym i wieloma kluczami” 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 „GroupBy z jednym i wieloma kluczami”?
Grupuj dane według jednej lub wielu kolumn za pomocą groupby() i stosuj agregacje sum, mean, count oraz min/max. Ć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 2 z 4.
Ile czasu zajmuje lekcja „GroupBy z jednym i wieloma kluczami”?
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