Stăpânește remodelarea datelor cu tabelele pivot Python Pandas. O analiză profundă a sintaxei, tehnicilor avansate și exemple practice pentru analiza globală a datelor.
Tabele Pivot Python Pandas: Un Ghid Cuprinzător pentru Remodelarea Datelor
În lumea analizei datelor, abilitatea de a rezuma, agrega și restructura datele nu este doar o abilitate—este o superputere. Datele brute, în forma lor nativă, adesea seamănă cu un registru extins și detaliat. Este bogat în informații, dar dificil de interpretat. Pentru a extrage informații semnificative, trebuie să transformăm acest registru într-un rezumat concis. Aici excelează exact tabelele pivot, iar pentru programatorii Python, biblioteca Pandas oferă un instrument puternic și flexibil: pivot_table().
Acest ghid este conceput pentru un public global de analiști de date, oameni de știință și entuziaști Python. Vom analiza profund mecanica tabelelor pivot Pandas, trecând de la concepte fundamentale la tehnici avansate. Indiferent dacă rezumați cifrele de vânzări de pe diferite continente, analizați datele climatice din diferite regiuni sau urmăriți indicatorii de proiect pentru o echipă distribuită, stăpânirea tabelelor pivot va schimba fundamental modul în care abordați explorarea datelor.
Ce Este Exact un Tabel Pivot?
Dacă ați folosit vreodată software de calcul tabelar, cum ar fi Microsoft Excel sau Google Sheets, probabil că sunteți familiarizat cu conceptul de tabel pivot. Este un tabel interactiv care vă permite să reorganizați și să rezumați coloanele și rândurile selectate de date dintr-un set de date mai mare pentru a obține un raport dorit.
Un tabel pivot face două lucruri cheie:
- Agregare: Calculează o statistică de sinteză (cum ar fi o sumă, o medie sau un număr) pentru datele numerice grupate după una sau mai multe categorii.
- Remodelare: Transformă datele dintr-un format "lung" într-un format "lat". În loc să aibă toate valorile într-o singură coloană, "pivotează" valorile unice dintr-o coloană în coloane noi în ieșire.
Funcția Pandas pivot_table() aduce această funcționalitate puternică direct în fluxul de lucru de analiză a datelor Python, permițând remodelarea reproductibilă, scriptabilă și scalabilă a datelor.
Configurarea Mediului și a Datelor Eșantion
Înainte de a începe, asigurați-vă că aveți instalată biblioteca Pandas. Dacă nu, o puteți instala folosind pip, programul de instalare a pachetelor Python:
pip install pandas
Acum, să o importăm în scriptul sau notebook-ul nostru Python:
import pandas as pd
import numpy as np
Crearea unui Set de Date Global de Vânzări
Pentru a face exemplele noastre practice și relevante la nivel global, vom crea un set de date sintetic care reprezintă datele de vânzări pentru o companie multinațională de comerț electronic. Acest set de date va include informații despre vânzările din diferite regiuni, țări și categorii de produse.
# 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())
Acest set de date ne oferă o bază solidă cu un amestec de date categorice (Regiune, Țară, Categorie_Produs), date numerice (Unități_Vândute, Venituri) și date de serie temporală (Data).
Anatomia pivot_table()
Funcția Pandas pivot_table() este incredibil de versatilă. Să descompunem cei mai importanți parametri ai săi:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
- data: DataFrame-ul pe care doriți să-l pivotați.
- values: Coloana(ele) care conțin datele care trebuie agregate. Dacă nu este specificat, vor fi utilizate toate coloanele numerice rămase.
- index: Coloana(ele) ale căror valori unice vor forma rândurile noului tabel pivot. Aceasta se numește uneori "cheia de grupare".
- columns: Coloana(ele) ale căror valori unice vor fi "pivotate" pentru a forma coloanele noului tabel.
- aggfunc: Funcția de agregare care se aplică la "values". Acesta poate fi un șir de caractere, cum ar fi "sum", "mean", "count", "min", "max" sau o funcție, cum ar fi
np.sum. Puteți, de asemenea, să transmiteți o listă de funcții sau un dicționar pentru a aplica diferite funcții diferitelor coloane. Valoarea implicită este "mean". - fill_value: O valoare pentru a înlocui orice rezultate lipsă (NaN) în tabelul pivot.
- margins: O valoare booleană. Dacă este setat la
True, adaugă subtotaluri pentru rânduri și coloane (cunoscute și sub numele de total general). - margins_name: Numele pentru rândul/coloana care conține totalurile când
margins=True. Valoarea implicită este "All".
Primul Dvs. Tabel Pivot: Un Exemplu Simplu
Să începem cu o întrebare obișnuită de afaceri: "Care sunt veniturile totale generate de fiecare categorie de produse?"
Pentru a răspunde la aceasta, trebuie să:
- Utilizați
Product_Categorypentru rânduri (index). - Agregați coloana
Revenue(values). - Utilizați suma ca funcție de agregare (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)
Ieșire:
Revenue
Product_Category
Apparel 1645
Books 1184
Electronics 56850
Instantaneu, avem un rezumat clar și concis. Jurnalul brut de tranzacții cu 20 de rânduri a fost remodelat într-un tabel cu 3 rânduri care răspunde direct la întrebarea noastră. Aceasta este puterea fundamentală a unui tabel pivot.
Adăugarea unei Dimensiuni de Coloană
Acum, să ne extindem asupra acestui lucru. Ce se întâmplă dacă dorim să vedem veniturile totale pe categorie de produse, dar și defalcate pe regiuni? Aici intervine parametrul 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)
Ieșire:
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
Această ieșire este mult mai bogată. Am pivotat valorile unice din coloana "Region" ("Asia", "Europe", "North America") în coloane noi. Acum putem compara cu ușurință modul în care diferite categorii de produse se comportă în diferite regiuni. Vedem, de asemenea, o valoare NaN (Nu este un număr). Aceasta indică faptul că nu au fost înregistrate vânzări de "Apparel" pentru "North America" în setul nostru de date. Aceasta este o informație valoroasă în sine!
Tehnici Avansate de Pivotare
Elementele de bază sunt puternice, dar adevărata flexibilitate a pivot_table() este dezvăluită în caracteristicile sale avansate.
Gestionarea Valorilor Lipsă cu fill_value
NaN în tabelul nostru anterior este exact, dar pentru raportare sau calcule suplimentare, ar putea fi preferabil să îl afișați ca zero. Parametrul fill_value face acest lucru ușor.
# 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)
Ieșire:
Region Asia Europe North America Product_Category Apparel 1125 625 0 Books 336 360 488 Electronics 13200 14550 29100
Tabelul este acum mai curat și mai ușor de citit, în special pentru un public non-tehnic.
Lucrul cu Mai Mulți Indici (Indexare Ierarhică)
Ce se întâmplă dacă trebuie să grupați după mai mult de o categorie pe rânduri? De exemplu, să defalcăm vânzările după Region și apoi după Country în fiecare regiune. Putem transmite o listă de coloane parametrului 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)
Ieșire:
Revenue
Region Country
Asia China 488
India 1760
Japan 10860
Europe France 1020
Germany 14440
UK 1115
North America Canada 17800
USA 12058
Pandas a creat automat un MultiIndex pe rânduri. Această structură ierarhică este fantastică pentru a analiza datele și a vedea relațiile imbricate. Puteți aplica aceeași logică parametrului columns pentru a crea coloane ierarhice.
Utilizarea Mai Multor Funcții de Agregare
Uneori, o singură statistică de sinteză nu este suficientă. S-ar putea să doriți să vedeți atât veniturile totale (suma), cât și dimensiunea medie a tranzacției (media) pentru fiecare grup. Puteți transmite o listă de funcții către aggfunc.
# Using multiple aggregation functions
multi_agg_pivot = pd.pivot_table(df,
values='Revenue',
index='Region',
aggfunc=['sum', 'mean', 'count'])
print(multi_agg_pivot)
Ieșire:
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
Această singură comandă ne oferă un rezumat cuprinzător: veniturile totale, veniturile medii per tranzacție și numărul de tranzacții pentru fiecare regiune. Observați modul în care Pandas creează coloane ierarhice pentru a menține ieșirea organizată.
Aplicarea Diferitelor Funcții la Diferite Valori
Puteți deveni și mai granular. Imaginați-vă că doriți să vedeți suma Revenue, dar media Units_Sold. Puteți transmite un dicționar către aggfunc, unde cheile sunt numele coloanelor ("values"), iar valorile sunt funcțiile de agregare dorite.
# 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)
Ieșire:
Revenue Units_Sold
Region
Asia 13108 17.833333
Europe 16575 8.166667
North America 29858 14.333333
Acest nivel de control este ceea ce face din pivot_table() un instrument principal pentru analiza sofisticată a datelor.
Calcularea Totalurilor Generale cu margins
În scopuri de raportare, este adesea esențial să aveți totaluri de rânduri și coloane. Argumentul margins=True oferă acest lucru fără niciun efort suplimentar.
# 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)
Ieșire:
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 calculează automat suma pentru fiecare rând (venitul total per categorie de produse în toate regiunile) și fiecare coloană (venitul total per regiune în toate categoriile), plus un total general pentru toate datele din colțul din dreapta jos.
Caz de Utilizare Practică: Analiza Bazată pe Timp
Tabelele pivot nu se limitează la categorii statice. Acestea sunt incredibil de utile pentru analizarea datelor de serie temporală. Să găsim veniturile totale pentru fiecare lună.
Mai întâi, trebuie să extragem luna din coloana noastră "Date". Putem utiliza selectorul .dt în Pandas pentru aceasta.
# 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)
Ieșire:
Product_Category Apparel Books Electronics Month January 250 360 23100 February 795 794 24250 March 705 30 9500
Acest tabel ne oferă o imagine clară a performanței vânzărilor fiecărei categorii de-a lungul timpului, permițându-ne să identificăm tendințele, sezonalitatea sau anomaliile cu ușurință.
pivot_table() vs. groupby(): Care este Diferența?
Aceasta este o întrebare obișnuită pentru cei care învață Pandas. Cele două funcții sunt strâns legate și, de fapt, pivot_table() este construită pe baza groupby().
groupby()este o operație mai generală și fundamentală. Grupează datele pe baza unor criterii și apoi vă permite să aplicați o funcție de agregare. Rezultatul este de obicei un Pandas Series sau DataFrame cu un index ierarhic, dar rămâne într-un format "lung".pivot_table()este un instrument specializat care face o grupare și apoi remodelează datele. Scopul său principal este de a transforma datele dintr-un format lung într-un format lat, care este adesea mai ușor de citit de către oameni.
Să revizuim primul nostru exemplu utilizând groupby():
# Same result as our first pivot table, but using groupby
category_revenue_groupby = df.groupby('Product_Category')['Revenue'].sum()
print(category_revenue_groupby)
Rezultatul este un Pandas Series care este funcțional echivalent cu DataFrame-ul din primul nostru tabel pivot. Cu toate acestea, atunci când introduceți o a doua cheie de grupare (cum ar fi "Region"), diferența devine clară.
# Grouping by two columns
groupby_multi = df.groupby(['Product_Category', 'Region'])['Revenue'].sum()
print(groupby_multi)
Ieșire (un Series cu un 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
Pentru a obține același format "lat" ca pivot_table(index='Product_Category', columns='Region'), ar trebui să utilizați groupby() urmat de unstack():
# Replicating a pivot table with groupby().unstack()
groupby_unstack = df.groupby(['Product_Category', 'Region'])['Revenue'].sum().unstack(fill_value=0)
print(groupby_unstack)
Aceasta produce exact aceeași ieșire ca și tabelul nostru pivot cu coloane. Deci, vă puteți gândi la pivot_table() ca la o comandă rapidă convenabilă pentru fluxul de lucru obișnuit groupby().aggregate().unstack().
Când să utilizați care?
- Utilizați
pivot_table()atunci când doriți o ieșire lată, ușor de citit, în special pentru raportare sau crearea de tabele încrucișate. - Utilizați
groupby()atunci când aveți nevoie de mai multă flexibilitate, efectuați calcule intermediare într-o conductă de procesare a datelor sau când formatul lat remodelat nu este obiectivul dvs. final.
Performanță și Cele Mai Bune Practici
În timp ce pivot_table() este puternic, este important să îl utilizați eficient, în special cu seturi de date mari.
- Filtrați Mai Întâi, Pivotați Mai Târziu: Dacă trebuie doar să analizați un subset al datelor dvs. (de exemplu, vânzările din ultimul an), filtrați DataFrame-ul înainte de a aplica tabelul pivot. Acest lucru reduce cantitatea de date pe care funcția trebuie să o proceseze.
- Utilizați Tipuri Categorice: Pentru coloanele pe care le utilizați frecvent ca indici sau coloane în tabelele dvs. pivot (cum ar fi "Region" sau "Product_Category"), convertiți-le la tipul de date "category" în Pandas. Acest lucru poate reduce semnificativ utilizarea memoriei și poate accelera operațiunile de grupare.
df['Region'] = df['Region'].astype('category') - Păstrați-l Lizibil: Evitați crearea de tabele pivot cu prea mulți indici și coloane. Deși este posibil, un tabel pivot care are sute de coloane lățime și mii de rânduri lungime poate deveni la fel de ilizibil ca și datele brute originale. Utilizați-l pentru a crea rezumate direcționate.
- Înțelegeți Agregarea: Fiți atent la alegerea dvs. de
aggfunc. Utilizarea "sum" pe prețuri nu are sens, în timp ce "mean" ar putea fi mai adecvat. Asigurați-vă întotdeauna că agregarea dvs. se aliniază cu întrebarea la care încercați să răspundeți.
Concluzie: Instrumentul Dvs. pentru Rezumate Profunde
Funcția Pandas pivot_table() este un instrument indispensabil în setul de instrumente al oricărui analist de date. Oferă o modalitate declarativă, expresivă și puternică de a trece de la date dezordonate și detaliate la rezumate curate și profunde. Înțelegând și stăpânind componentele sale de bază—values, index, columns și aggfunc—și valorificând caracteristicile sale avansate, cum ar fi indexarea pe mai multe niveluri, agregările personalizate și marginile, puteți remodela datele pentru a răspunde la întrebări complexe de afaceri cu doar câteva linii de cod Python.
Data viitoare când vă confruntați cu un set de date mare, rezistați impulsului de a derula prin rânduri nesfârșite. În schimb, gândiți-vă la întrebările la care trebuie să răspundeți și la modul în care un tabel pivot vă poate remodela datele pentru a dezvălui poveștile ascunse în interior. Pivotare fericită!