Opanuj przekształcanie danych za pomocą tabel przestawnych Python Pandas. Dogłębna analiza składni, zaawansowanych technik i praktycznych przykładów dla globalnej analizy danych.
Tabele przestawne Python Pandas: Kompletny przewodnik po przekształcaniu danych
W świecie analizy danych, umiejętność podsumowywania, agregowania i restrukturyzacji danych to nie tylko umiejętność – to supermoc. Surowe dane, w swojej pierwotnej formie, często przypominają rozległy, szczegółowy rejestr. Są bogate w informacje, ale trudne do interpretacji. Aby wydobyć z nich znaczące spostrzeżenia, musimy przekształcić ten rejestr w zwięzłe podsumowanie. Właśnie w tym przodują tabele przestawne, a dla programistów Pythona biblioteka Pandas dostarcza potężne i elastyczne narzędzie: pivot_table().
Ten przewodnik jest przeznaczony dla globalnej publiczności analityków danych, naukowców i entuzjastów Pythona. Dogłębnie zagłębimy się w mechanikę tabel przestawnych Pandas, przechodząc od podstawowych koncepcji do zaawansowanych technik. Niezależnie od tego, czy podsumowujesz dane sprzedaży z różnych kontynentów, analizujesz dane klimatyczne z różnych regionów, czy śledzisz metryki projektu dla rozproszonego zespołu, opanowanie tabel przestawnych fundamentalnie zmieni sposób, w jaki podchodzisz do eksploracji danych.
Czym dokładnie jest tabela przestawna?
Jeśli kiedykolwiek korzystałeś z oprogramowania arkuszowego, takiego jak Microsoft Excel lub Google Sheets, prawdopodobnie znasz koncepcję tabeli przestawnej. Jest to interaktywna tabela, która umożliwia reorganizację i podsumowanie wybranych kolumn i wierszy danych z większego zbioru danych w celu uzyskania pożądanego raportu.
Tabela przestawna wykonuje dwie kluczowe czynności:
- Agregacja: Oblicza statystykę podsumowującą (taką jak suma, średnia lub liczba) dla danych liczbowych pogrupowanych według jednej lub więcej kategorii.
- Przekształcanie: Przekształca dane z formatu 'długiego' na format 'szeroki'. Zamiast mieć wszystkie wartości w jednej kolumnie, 'przestawia' unikalne wartości z kolumny do nowych kolumn w wyniku.
Funkcja pivot_table() biblioteki Pandas wprowadza tę potężną funkcjonalność bezpośrednio do Twojego przepływu pracy analizy danych w Pythonie, umożliwiając odtwarzalne, skryptowalne i skalowalne przekształcanie danych.
Konfiguracja środowiska i przykładowe dane
Zanim zaczniemy, upewnij się, że masz zainstalowaną bibliotekę Pandas. Jeśli nie, możesz ją zainstalować za pomocą pip, instalatora pakietów Pythona:
pip install pandas
Teraz zaimportujmy ją w naszym skrypcie Pythona lub notatniku:
import pandas as pd
import numpy as np
Tworzenie globalnego zbioru danych o sprzedaży
Aby nasze przykłady były praktyczne i globalnie istotne, stworzymy syntetyczny zbiór danych reprezentujący dane sprzedaży dla międzynarodowej firmy e-commerce. Ten zbiór danych będzie zawierał informacje o sprzedaży z różnych regionów, krajów i kategorii produktów.
# Create a dictionary of data
data = {
'TransactionID': range(1, 21),
'Date': pd.to_datetime([
'2023-01-15', '2023-01-16', '2023-01-17', '2023-02-10', '2023-02-11',
'2023-02-12', '2023-03-05', '2023-03-06', '2023-03-07', '2023-01-20',
'2023-01-21', '2023-02-15', '2023-02-16', '2023-03-10', '2023-03-11',
'2023-01-18', '2023-02-20', '2023-03-22', '2023-01-25', '2023-02-28'
]),
'Region': [
'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'Europe',
'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Asia', 'Europe', 'North America', 'Europe', 'Asia'
],
'Country': [
'USA', 'Germany', 'Japan', 'Canada', 'France', 'India', 'USA', 'UK', 'China', 'Germany',
'Japan', 'USA', 'France', 'India', 'Canada', 'China', 'UK', 'USA', 'Germany', 'India'
],
'Product_Category': [
'Electronics', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Electronics', 'Apparel',
'Apparel', 'Books', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Books', 'Electronics', 'Electronics'
],
'Units_Sold': [10, 5, 8, 20, 7, 12, 15, 9, 25, 6, 30, 11, 18, 22, 14, 28, 4, 16, 13, 10],
'Unit_Price': [1200, 50, 900, 15, 60, 1100, 18, 950, 45, 55, 12, 1300, 20, 40, 1250, 14, 65, 16, 1150, 1050]
}
# Create DataFrame
df = pd.DataFrame(data)
# Calculate Revenue
df['Revenue'] = df['Units_Sold'] * df['Unit_Price']
# Display the first few rows of the DataFrame
print(df.head())
Ten zbiór danych stanowi solidną podstawę z mieszanką danych kategorycznych (Region, Country, Product_Category), danych liczbowych (Units_Sold, Revenue) i danych szeregów czasowych (Date).
Anatomia funkcji pivot_table()
Funkcja pivot_table() biblioteki Pandas jest niezwykle wszechstronna. Przyjrzyjmy się jej najważniejszym parametrom:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
- data: DataFrame, które chcesz przestawić.
- values: Kolumna(y) zawierająca(e) dane do agregacji. Jeśli nie określono, zostaną użyte wszystkie pozostałe kolumny numeryczne.
- index: Kolumna(y), której(ych) unikalne wartości utworzą wiersze nowej tabeli przestawnej. Jest to czasami nazywane 'kluczem grupowania'.
- columns: Kolumna(y), której(ych) unikalne wartości zostaną 'przestawione' w celu utworzenia kolumn nowej tabeli.
- aggfunc: Funkcja agregacji do zastosowania do 'wartości'. Może to być ciąg znaków, taki jak 'sum', 'mean', 'count', 'min', 'max' lub funkcja taka jak
np.sum. Można również przekazać listę funkcji lub słownik, aby zastosować różne funkcje do różnych kolumn. Domyślnie jest to 'mean'. - fill_value: Wartość, która zastąpi wszelkie brakujące wyniki (NaN) w tabeli przestawnej.
- margins: Wartość logiczna (boolean). Jeśli ustawiona na
True, dodaje sumy częściowe dla wierszy i kolumn (znane również jako suma ogólna). - margins_name: Nazwa dla wiersza/kolumny zawierającej sumy, gdy
margins=True. Domyślnie jest to 'All'.
Twoja pierwsza tabela przestawna: Prosty przykład
Zacznijmy od powszechnego pytania biznesowego: "Jaki jest całkowity przychód generowany przez każdą kategorię produktów?"
Aby odpowiedzieć na to pytanie, musimy:
- Użyć
Product_Categorydla wierszy (index). - Agregować kolumnę
Revenue(values). - Użyć sumy jako funkcji agregacji (aggfunc).
# Simple pivot table to see total revenue by product category
category_revenue = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
aggfunc='sum')
print(category_revenue)
Wynik:
Revenue
Product_Category
Apparel 1645
Books 1184
Electronics 56850
Natychmiast uzyskujemy jasne, zwięzłe podsumowanie. Surowy, 20-wierszowy dziennik transakcji został przekształcony w 3-wierszową tabelę, która bezpośrednio odpowiada na nasze pytanie. To jest fundamentalna moc tabeli przestawnej.
Dodawanie wymiaru kolumny
Teraz rozwińmy to. Co jeśli chcemy zobaczyć całkowity przychód według kategorii produktów, ale także z podziałem na regiony? W tym miejscu do gry wchodzi parametr columns.
# Pivot table with index and columns
revenue_by_category_region = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum')
print(revenue_by_category_region)
Wynik:
Region Asia Europe North America Product_Category Apparel 1125.0 625.0 NaN Books 336.0 360.0 488.0 Electronics 13200.0 14550.0 29100.0
Ten wynik jest znacznie bogatszy. Przestawiliśmy unikalne wartości z kolumny 'Region' ('Asia', 'Europe', 'North America') do nowych kolumn. Możemy teraz łatwo porównać, jak różne kategorie produktów radzą sobie w różnych regionach. Widzimy również wartość NaN (Not a Number - Nie jest liczbą). Wskazuje to, że w naszym zbiorze danych nie zarejestrowano sprzedaży 'Odzieży' dla 'Ameryki Północnej'. To samo w sobie jest cenną informacją!
Zaawansowane techniki przestawiania danych
Podstawy są potężne, ale prawdziwa elastyczność funkcji pivot_table() ujawnia się w jej zaawansowanych funkcjach.
Obsługa brakujących wartości za pomocą fill_value
Wartość NaN w naszej poprzedniej tabeli jest dokładna, ale dla celów raportowania lub dalszych obliczeń, może być korzystniejsze wyświetlanie jej jako zero. Parametr fill_value to ułatwia.
# Using fill_value to replace NaN with 0
revenue_by_category_region_filled = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0)
print(revenue_by_category_region_filled)
Wynik:
Region Asia Europe North America Product_Category Apparel 1125 625 0 Books 336 360 488 Electronics 13200 14550 29100
Tabela jest teraz czystsza i łatwiejsza do odczytania, zwłaszcza dla odbiorców nietechnicznych.
Praca z wieloma indeksami (indeksowanie hierarchiczne)
Co jeśli potrzebujesz grupować według więcej niż jednej kategorii w wierszach? Na przykład, rozbijmy sprzedaż według Regionu, a następnie według Kraju w obrębie każdego regionu. Możemy przekazać listę kolumn do parametru index.
# Multi-level pivot table using a list for the index
multi_index_pivot = pd.pivot_table(df,
values='Revenue',
index=['Region', 'Country'],
aggfunc='sum',
fill_value=0)
print(multi_index_pivot)
Wynik:
Revenue
Region Country
Asia China 488
India 1760
Japan 10860
Europe France 1020
Germany 14440
UK 1115
North America Canada 17800
USA 12058
Pandas automatycznie utworzył MultiIndex w wierszach. Ta hierarchiczna struktura jest fantastyczna do zagłębiania się w dane i dostrzegania zagnieżdżonych zależności. Możesz zastosować tę samą logikę do parametru columns, aby stworzyć hierarchiczne kolumny.
Używanie wielu funkcji agregacji
Czasami jedna statystyka podsumowująca to za mało. Możesz chcieć zobaczyć zarówno całkowity przychód (sumę), jak i średnią wartość transakcji (średnią) dla każdej grupy. Możesz przekazać listę funkcji do aggfunc.
# Using multiple aggregation functions
multi_agg_pivot = pd.pivot_table(df,
values='Revenue',
index='Region',
aggfunc=['sum', 'mean', 'count'])
print(multi_agg_pivot)
Wynik:
sum mean count
Revenue Revenue Revenue
Region
Asia 13108.000000 2184.666667 6
Europe 16575.000000 2762.500000 6
North America 29858.000000 4976.333333 6
To pojedyncze polecenie daje nam kompleksowe podsumowanie: całkowity przychód, średni przychód na transakcję oraz liczbę transakcji dla każdego regionu. Zauważ, jak Pandas tworzy hierarchiczne kolumny, aby utrzymać porządek w danych wyjściowych.
Stosowanie różnych funkcji do różnych wartości
Możesz uzyskać jeszcze większą szczegółowość. Wyobraź sobie, że chcesz zobaczyć sumę Revenue, ale średnią Units_Sold. Możesz przekazać słownik do aggfunc, gdzie kluczem są nazwy kolumn ('values'), a wartościami są pożądane funkcje agregacji.
# Different aggregations for different values
dict_agg_pivot = pd.pivot_table(df,
index='Region',
values=['Revenue', 'Units_Sold'],
aggfunc={
'Revenue': 'sum',
'Units_Sold': 'mean'
},
fill_value=0)
print(dict_agg_pivot)
Wynik:
Revenue Units_Sold
Region
Asia 13108 17.833333
Europe 16575 8.166667
North America 29858 14.333333
Ten poziom kontroli sprawia, że pivot_table() jest doskonałym narzędziem do zaawansowanej analizy danych.
Obliczanie sum ogólnych za pomocą margins
Dla celów raportowania, posiadanie sum wierszy i kolumn jest często niezbędne. Argument margins=True zapewnia to bez dodatkowego wysiłku.
# Adding totals with margins=True
revenue_with_margins = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='Grand Total') # Custom name for totals
print(revenue_with_margins)
Wynik:
Region Asia Europe North America Grand Total Product_Category Apparel 1125 625 0 1750 Books 336 360 488 1184 Electronics 13200 14550 29100 56850 Grand Total 14661 15535 29588 59784
Pandas automatycznie oblicza sumę dla każdego wiersza (całkowity przychód dla każdej kategorii produktów we wszystkich regionach) i każdej kolumny (całkowity przychód dla każdego regionu we wszystkich kategoriach), a także sumę ogólną dla wszystkich danych w prawym dolnym rogu.
Praktyczne zastosowanie: analiza czasowa
Tabele przestawne nie ograniczają się do statycznych kategorii. Są niezwykle przydatne do analizy danych szeregów czasowych. Znajdźmy całkowity przychód dla każdego miesiąca.
Najpierw musimy wyodrębnić miesiąc z naszej kolumny 'Date'. Możemy użyć do tego akcesorii .dt w Pandas.
# Extract month from the Date column
df['Month'] = df['Date'].dt.month_name()
# Pivot to see monthly revenue by product category
monthly_revenue = pd.pivot_table(df,
values='Revenue',
index='Month',
columns='Product_Category',
aggfunc='sum',
fill_value=0)
# Optional: Order the months correctly
month_order = ['January', 'February', 'March']
monthly_revenue = monthly_revenue.reindex(month_order)
print(monthly_revenue)
Wynik:
Product_Category Apparel Books Electronics Month January 250 360 23100 February 795 794 24250 March 705 30 9500
Ta tabela zapewnia nam jasny obraz wyników sprzedaży każdej kategorii w czasie, umożliwiając łatwe dostrzeżenie trendów, sezonowości lub anomalii z łatwością.
pivot_table() kontra groupby(): Jaka jest różnica?
To częste pytanie dla osób uczących się Pandas. Obie funkcje są ze sobą ściśle powiązane, a w rzeczywistości pivot_table() jest zbudowana na bazie groupby().
groupby()to bardziej ogólna i fundamentalna operacja. Grupuje dane na podstawie pewnych kryteriów, a następnie pozwala zastosować funkcję agregacji. Wynikiem jest zazwyczaj obiekt Pandas Series lub DataFrame z hierarchicznym indeksem, ale pozostaje w formacie 'długim'.pivot_table()to wyspecjalizowane narzędzie, które wykonuje grupowanie, a następnie przekształca dane. Jego głównym celem jest transformacja danych z formatu długiego na format szeroki, który jest często bardziej czytelny dla człowieka.
Powróćmy do naszego pierwszego przykładu, używając groupby():
# Same result as our first pivot table, but using groupby
category_revenue_groupby = df.groupby('Product_Category')['Revenue'].sum()
print(category_revenue_groupby)
Wynikiem jest obiekt Pandas Series, który jest funkcjonalnie równoważny z DataFrame z naszej pierwszej tabeli przestawnej. Jednakże, gdy wprowadzisz drugi klucz grupowania (jak 'Region'), różnica staje się jasna.
# Grouping by two columns
groupby_multi = df.groupby(['Product_Category', 'Region'])['Revenue'].sum()
print(groupby_multi)
Wynik (Series z MultiIndex):
Product_Category Region
Apparel Asia 1125
Europe 625
Books Asia 336
Europe 360
North America 488
Electronics Asia 13200
Europe 14550
North America 29100
Name: Revenue, dtype: int64
Aby uzyskać ten sam format 'szeroki', co pivot_table(index='Product_Category', columns='Region'), musiałbyś użyć groupby(), a następnie unstack():
# Replicating a pivot table with groupby().unstack()
groupby_unstack = df.groupby(['Product_Category', 'Region'])['Revenue'].sum().unstack(fill_value=0)
print(groupby_unstack)
To generuje dokładnie taki sam wynik jak nasza tabela przestawna z kolumnami. Zatem możesz myśleć o pivot_table() jako o wygodnym skrócie dla typowego przepływu pracy groupby().aggregate().unstack().
Kiedy używać której?
- Użyj
pivot_table(), gdy chcesz uzyskać czytelny, szeroki format danych wyjściowych, zwłaszcza do raportowania lub tworzenia tabel krzyżowych. - Użyj
groupby(), gdy potrzebujesz większej elastyczności, wykonujesz pośrednie obliczenia w potoku przetwarzania danych lub gdy przekształcony, szeroki format nie jest Twoim ostatecznym celem.
Wydajność i najlepsze praktyki
Chociaż pivot_table() jest potężne, ważne jest, aby używać go efektywnie, zwłaszcza z dużymi zbiorami danych.
- Najpierw filtruj, potem przestawiaj: Jeśli musisz analizować tylko podzbiór danych (np. sprzedaż z ostatniego roku), filtruj DataFrame przed zastosowaniem tabeli przestawnej. Zmniejsza to ilość danych, które funkcja musi przetworzyć.
- Używaj typów kategorycznych: Dla kolumn, których często używasz jako indeksów lub kolumn w tabelach przestawnych (takich jak 'Region' lub 'Product_Category'), przekonwertuj je na typ 'category' w Pandas. Może to znacznie zmniejszyć zużycie pamięci i przyspieszyć operacje grupowania.
df['Region'] = df['Region'].astype('category') - Zachowaj czytelność: Unikaj tworzenia tabel przestawnych z zbyt wieloma indeksami i kolumnami. Chociaż jest to możliwe, tabela przestawna, która ma setki kolumn i tysiące wierszy, może stać się równie nieczytelna jak oryginalne surowe dane. Używaj jej do tworzenia ukierunkowanych podsumowań.
- Zrozum agregację: Pamiętaj o wyborze
aggfunc. Użycie 'sum' dla cen nie ma sensu, podczas gdy 'mean' może być bardziej odpowiednie. Zawsze upewnij się, że agregacja jest zgodna z pytaniem, na które próbujesz odpowiedzieć.
Wnioski: Twoje narzędzie do tworzenia wnikliwych podsumowań
Funkcja Pandas pivot_table() to niezastąpione narzędzie w zestawie każdego analityka danych. Zapewnia deklaratywny, ekspresywny i potężny sposób przechodzenia od nieuporządkowanych, szczegółowych danych do czystych, wnikliwych podsumowań. Rozumiejąc i opanowując jej podstawowe komponenty — values, index, columns i aggfunc — oraz wykorzystując jej zaawansowane funkcje, takie jak indeksowanie wielopoziomowe, niestandardowe agregacje i marginesy, możesz przekształcić swoje dane, aby odpowiedzieć na złożone pytania biznesowe za pomocą zaledwie kilku linii kodu Pythona.
Następnym razem, gdy staniesz przed dużym zbiorem danych, oprzyj się pokusie przewijania niekończących się wierszy. Zamiast tego, zastanów się nad pytaniami, na które musisz odpowiedzieć i jak tabela przestawna może przekształcić Twoje dane, aby odkryć ukryte w nich historie. Miłego przestawiania!