0Pricing
Pandas & NumPy Academy · Lekcja

pivot_table: tabulacja krzyżowa

Twórz tabele przestawne w stylu Excela za pomocą pd.pivot_table, ustawiając indeks, kolumny, wartości i aggfunc.

pivot_table: tabulacja krzyżowa 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 tabela przestawna?

Tabela przestawna to zestawienie krzyżowe, które podsumowuje dane według dwóch wymiarów kategorialnych — jeden tworzy wiersze, a drugi kolumny — umieszczając w każdej komórce zagregowaną wartość. Jeśli kiedykolwiek tworzysz tabelę przestawną w Excelu, od razu rozpoznasz tę koncepcję. Pandas udostępnia pd.pivot_table() (a także odpowiadającą mu metodę obiektu DataFrame), aby tworzyć takie podsumowania w całości w Pythonie.

Podstawowe wywołanie pivot_table

Cztery najważniejsze parametry pd.pivot_table() to: values (kolumna poddawana agregacji), index (kolumna, która stanie się wierszami), columns (kolumna, która stanie się kolumnami) oraz aggfunc (funkcja agregująca, domyślnie 'mean'). Wynikiem jest obiekt DataFrame, w którym każda komórka zawiera zagregowaną wartość dla danej kombinacji wiersza i kolumny.

import pandas as pd

df = pd.DataFrame({
    'region':  ['East', 'West', 'East', 'West', 'East', 'West'],
    'product': ['A',    'A',    'B',    'B',    'A',    'B'],
    'revenue': [200,    340,    150,    290,    310,    410]
})

table = pd.pivot_table(df,
                       values='revenue',
                       index='region',
                       columns='product',
                       aggfunc='sum')
print(table)
# product    A    B
# region
# East     510  150
# West     340  700

Wybór funkcji aggfunc

Parametr aggfunc przyjmuje dowolną nazwę tekstową funkcji agregującej NumPy/Pandas, funkcję wywoływalną lub listę funkcji wywoływalnych. Typowe wybory to: 'sum' dla sum, 'mean' dla średnich, 'count' dla liczności oraz 'min'/'max' dla wartości skrajnych. Gdy przekazujesz listę, każda agregacja otrzymuje własny poziom w indeksie wielopoziomowym kolumn.

# Using mean (default)
table_mean = pd.pivot_table(df, values='revenue',
                            index='region', columns='product',
                            aggfunc='mean')
print(table_mean.round(1))
# product      A      B
# region
# East     255.0  150.0
# West     340.0  350.0

# Using count
table_count = pd.pivot_table(df, values='revenue',
                             index='region', columns='product',
                             aggfunc='count')
print(table_count)

Obsługa pustych komórek za pomocą fill_value

Gdy dla kombinacji etykiety wiersza i kolumny nie ma danych, komórka domyślnie zawiera NaN. Przekaż fill_value, aby zastąpić takie brakujące komórki znaczącą wartością domyślną, na przykład 0 w przypadku liczności lub przychodu. Dzięki temu tabela jest łatwiejsza do odczytania, a kolejne operacje arytmetyczne nie generują niejawnie wyników NaN.

df2 = pd.DataFrame({
    'region':  ['East', 'West', 'East'],
    'product': ['A',    'A',    'B'],
    'revenue': [200,    340,    150]
})

# West-B combination has no data -> NaN by default
table = pd.pivot_table(df2, values='revenue', index='region',
                       columns='product', aggfunc='sum', fill_value=0)
print(table)
# product    A    B
# region
# East     200  150
# West     340    0  <- filled with 0 instead of NaN

Dodawanie sum częściowych za pomocą margins

Przekaż margins=True, aby dodać do tabeli przestawnej sumy wierszy i kolumn. Pandas dołącza wiersz 'All' na dole oraz kolumnę 'All' po prawej stronie; zawierają one zagregowane wartości dla wszystkich kategorii. Etykietę sumy można zmienić za pomocą margins_name. Działa to podobnie do wiersza „Grand Total” w tabelach przestawnych Excela.

table = pd.pivot_table(df, values='revenue', index='region',
                       columns='product', aggfunc='sum',
                       fill_value=0, margins=True, margins_name='Total')
print(table)
# product    A     B  Total
# region
# East     510   150    660
# West     340   700   1040
# Total    850   850   1700

Wiele wartości w pivot_table

Parametr values może być listą nazw kolumn, co pozwala agregować wiele miar jednocześnie. Wynik ma wielopoziomowy indeks kolumn, którego zewnętrzny poziom stanowi kolumna wartości, a wewnętrzny — kategoria. Umożliwia to utworzenie kompleksowej tabeli podsumowującej w jednym wywołaniu zamiast budowania i scalania wielu oddzielnych tabel przestawnych.

df['units'] = [10, 15, 8, 12, 14, 18]

table = pd.pivot_table(df,
                       values=['revenue', 'units'],
                       index='region',
                       columns='product',
                       aggfunc='sum')
print(table)
# Columns: (revenue, A), (revenue, B), (units, A), (units, B)
print(table.columns.tolist())

Hierarchiczny indeks i kolumny

Gdy przekażesz listę do index lub columns, tabela przestawna ma MultiIndex na odpowiedniej osi. Umożliwia to tworzenie bardziej szczegółowych podsumowań — na przykład podział przychodu według regionu i kwartału w wierszach oraz według produktu w kolumnach. Dostęp do niższych poziomów uzyskasz za pomocą .loc i krotek indeksów, tak jak zwykle.

df['quarter'] = ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q2']

table = pd.pivot_table(df, values='revenue',
                       index=['region', 'quarter'],
                       columns='product',
                       aggfunc='sum', fill_value=0)
print(table)
# product         A    B
# region quarter
# East   Q1     510    0
#        Q2       0  150
# West   Q1     340    0
#        Q2       0  700

Spłaszczanie wyniku

Po utworzeniu tabeli przestawnej indeks stanowi kolumnę grupowania, a wielopoziomowy indeks kolumn (w przypadku użycia wielu wartości) może być niewygodny. Typowy sposób uporządkowania wyniku polega na wywołaniu reset_index() w celu spłaszczenia indeksu wierszy, a następnie połączeniu poziomów indeksu kolumn w jeden poziom za pomocą znaku podkreślenia i list comprehension.

table = pd.pivot_table(df, values=['revenue', 'units'],
                       index='region', columns='product', aggfunc='sum')

# Flatten MultiIndex columns
table.columns = ['_'.join(str(c) for c in col) for col in table.columns]
table = table.reset_index()
print(table.columns.tolist())
# ['region', 'revenue_A', 'revenue_B', 'units_A', 'units_B']

pivot_table a groupby().agg()

Zarówno pivot_table, jak i groupby().agg() tworzą statystyki podsumowujące. Różnica dotyczy kształtu wyniku: groupby().agg() zwraca obiekt DataFrame w układzie długim, z jednym wierszem na każdą kombinację grup, natomiast pivot_table zwraca tabelę w układzie szerokim, w której jeden wymiar staje się kolumnami. W przypadku pulpitów nawigacyjnych i raportów szeroki format tabel przestawnych jest często czytelniejszy, natomiast do dalszej analizy uczenia maszynowego lub analizy statystycznej preferowany jest format długi.

# Long format (groupby)
long = df.groupby(['region', 'product'])['revenue'].sum().reset_index()
print(long)
# region product  revenue
# East        A      510
# East        B      150

# Wide format (pivot_table)
wide = pd.pivot_table(df, 'revenue', 'region', 'product', 'sum', fill_value=0)
print(wide)
# product    A    B
# region
# East     510  150

Sortowanie i stylizowanie tabeli przestawnej

Tabela przestawna jest zwykłym obiektem DataFrame, więc można ją sortować, obliczać kolumny pochodne i formatować dokładnie tak jak każdy inny obiekt DataFrame biblioteki Pandas. Możesz na przykład posortować dane malejąco według kolumny konkretnego produktu, aby uszeregować regiony według wyników tego produktu, albo dodać kolumnę procentową, dzieląc każdą komórkę przez sumę wiersza.

table = pd.pivot_table(df, 'revenue', 'region', 'product', 'sum', fill_value=0)

# Sort by product A revenue descending
table_sorted = table.sort_values('A', ascending=False)
print(table_sorted)

# Add percentage of row total
table['A_pct'] = (table['A'] / table.sum(axis=1) * 100).round(1)
print(table)

Praktyczne zastosowanie: tabela pulpitu sprzedażowego

Tabele przestawne są podstawowym narzędziem do tworzenia raportów zarządczych i pulpitów nawigacyjnych. Typowy proces obejmuje wczytanie surowych danych transakcyjnych, utworzenie tabeli przestawnej z miesiącami jako kolumnami i kategoriami produktów jako wierszami, dodanie sum oraz eksport do Excela. Cały proces — od surowych danych do tabeli gotowej do przedstawienia zarządowi — wymaga zaledwie kilku wywołań Pandas.

# Simulated monthly product revenue pivot
result = pd.pivot_table(
    df,
    values='revenue',
    index='product',
    columns='region',
    aggfunc='sum',
    fill_value=0,
    margins=True,
    margins_name='Grand Total'
)
print(result)
# Export to Excel
# result.to_excel('sales_pivot.xlsx')

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat pd.pivot_table z tego rozdziału.

Podsumowanie lekcji

W tej lekcji nauczyłeś się, że: pd.pivot_table() tworzy podsumowania w formie zestawień krzyżowych, w których jeden wymiar stanowi wiersze, a drugi kolumny; fill_value obsługuje brakujące komórki, a margins=True dodaje sumy; można agregować wiele wartości jednocześnie; a tabele przestawne tworzą wynik w szerokim formacie, idealnym do raportów. Następnie zajmiemy się operacją odwrotną: melt(), która przekształca dane z szerokiego formatu z powrotem do długiego.

Często zadawane pytania

Czy lekcja „pivot_table: tabulacja krzyżowa” jest bezpłatna?

Tak — pełny tekst „pivot_table: tabulacja krzyżowa” 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 „pivot_table: tabulacja krzyżowa”?

Twórz tabele przestawne w stylu Excela za pomocą pd.pivot_table, ustawiając indeks, kolumny, wartości i aggfunc. Ć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 „pivot_table: tabulacja krzyżowa”?

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. pivot_table: tabulacja krzyżowa
  2. melt: format szeroki na długi
  3. stack i unstack z MultiIndex
  4. crosstab do tabel częstości
← Powrót do Pandas & NumPy Academy