pd.concat per impilare DataFrame
Impili i DataFrame verticalmente o orizzontalmente con pd.concat, li allinei in base all'indice o alle colonne e gestisca gli indici duplicati.
pd.concat per impilare DataFrame è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Perché concatenare i DataFrame?
Nei progetti reali, i dati raramente arrivano in un unico file. Potrebbe avere file mensili sulle vendite, esportazioni di sondaggi regionali o risultati di query al database suddivisi tra più query. La concatenazione impila questi DataFrame separati in un'unica tabella combinata. Pandas mette a disposizione pd.concat() per questo scopo, gestendo sia l'impilamento verticale (per righe) sia quello orizzontale (per colonne).
Concatenazione verticale di base
L'uso più comune di pd.concat() consiste nell'impilare i DataFrame verticalmente, aggiungendo altre righe. Si passa un elenco di DataFrame e la funzione li aggiunge uno sotto l'altro. Per ottenere un risultato pulito, i DataFrame devono avere colonne compatibili. Pandas allinea automaticamente i nomi delle colonne e riempie le colonne mancanti con NaN.
import pandas as pd
jan = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
feb = pd.DataFrame({'product': ['A', 'C'], 'sales': [150, 120]})
combined = pd.concat([jan, feb])
print(combined)
# product sales
# 0 A 100
# 1 B 200
# 0 A 150
# 1 C 120Reimpostare l'indice dopo la concatenazione
Noti che pd.concat() conserva gli indici originali di ogni DataFrame, cosa che può produrre valori di indice duplicati, come nell'esempio precedente con due righe all'indice 0 e due all'indice 1. Passi ignore_index=True per creare nel risultato combinato un nuovo indice intero sequenziale: è quasi sempre ciò che desidera.
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)
# product sales
# 0 A 100
# 1 B 200
# 2 A 150
# 3 C 120
print(combined.index)
# RangeIndex(start=0, stop=4, step=1)Tenere traccia dell'origine con keys
Quando concatena dati provenienti da più origini, potrebbe voler sapere da quale DataFrame originale proviene ogni riga. Passi il parametro keys con un elenco di etichette. Pandas crea un MultiIndex il cui livello esterno identifica l'origine. Può quindi usare .loc['label'] per accedere alle righe di un'origine specifica.
combined = pd.concat([jan, feb], keys=['January', 'February'])
print(combined)
# product sales
# January 0 A 100
# 1 B 200
# February 0 A 150
# 1 C 120
# Access only February rows
print(combined.loc['February'])Concatenazione orizzontale con axis=1
Passi axis=1 per concatenare i DataFrame affiancandoli, aggiungendo altre colonne. Pandas li allinea in base all'indice delle righe, quindi per ottenere un risultato pulito i due DataFrame dovrebbero avere lo stesso indice. Se gli indici differiscono, le righe non corrispondenti vengono riempite con NaN. Questo è utile per combinare feature calcolate separatamente a partire dallo stesso dataset.
names = pd.DataFrame({'name': ['Alice', 'Bob', 'Carol']}, index=[1, 2, 3])
scores = pd.DataFrame({'score': [95, 88, 72]}, index=[1, 2, 3])
combined = pd.concat([names, scores], axis=1)
print(combined)
# name score
# 1 Alice 95
# 2 Bob 88
# 3 Carol 72Gestire colonne non corrispondenti
Se i DataFrame concatenati hanno colonne diverse, Pandas mantiene tutte le colonne e riempie i valori mancanti con NaN. Questo è il comportamento predefinito di join='outer'. Se desidera mantenere solo le colonne presenti in tutti i DataFrame, passi join='inner', che elimina ogni colonna non presente in tutte le origini.
df1 = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df2 = pd.DataFrame({'b': [5, 6], 'c': [7, 8]})
# Outer join (default): keeps all columns
print(pd.concat([df1, df2], ignore_index=True))
# a b c
# 0 1.0 3 NaN
# 1 2.0 4 NaN
# 2 NaN 5 7.0
# 3 NaN 6 8.0
# Inner join: keeps only shared columns
print(pd.concat([df1, df2], join='inner', ignore_index=True))
# b
# 0 3
# 1 4
# 2 5
# 3 6Concatenare molti file in un ciclo
Un approccio tipico per caricare più file consiste nel raccogliere tutti i DataFrame in un elenco e chiamare pd.concat() una sola volta alla fine. Eviti di concatenare all'interno di un ciclo, ad esempio df = pd.concat([df, new_chunk]), perché a ogni iterazione viene creata una nuova copia del DataFrame, con una complessità temporale quadratica per raccolte di grandi dimensioni.
import glob
# Efficient: collect first, concat once
files = glob.glob('data/sales_*.csv')
frames = [pd.read_csv(f) for f in files]
combined = pd.concat(frames, ignore_index=True)
# Inefficient (avoid):
# result = pd.DataFrame()
# for f in files:
# result = pd.concat([result, pd.read_csv(f)]) # slow!Concatenare Series
pd.concat() funziona sia con le Series sia con i DataFrame. Concatenando verticalmente un elenco di Series si ottiene una Series più lunga. Concatenando con axis=1 si produce un DataFrame in cui ogni Series diventa una colonna. Le Series vengono allineate in base al proprio indice, quindi per una concatenazione orizzontale pulita le etichette dell'indice devono corrispondere.
s1 = pd.Series([1, 2, 3], name='x')
s2 = pd.Series([4, 5, 6], name='y')
# Vertical: one long Series
print(pd.concat([s1, s2]))
# 0 1
# 1 2
# ...
# Horizontal: a DataFrame with two columns
print(pd.concat([s1, s2], axis=1))
# x y
# 0 1 4
# 1 2 5
# 2 3 6Verificare il risultato della concatenazione
Dopo la concatenazione, verifichi sempre che il risultato abbia la forma prevista e non contenga valori NaN imprevisti. Un rapido controllo di coerenza consiste nel confrontare il numero complessivo di righe con la somma dei conteggi individuali e chiamare isna().sum() per individuare eventuali valori mancanti introdotti involontariamente dal disallineamento delle colonne. Questi controlli impediscono che problemi silenziosi di qualità dei dati si propaghino nelle analisi.
combined = pd.concat([jan, feb], ignore_index=True)
# Sanity checks
assert len(combined) == len(jan) + len(feb), 'Row count mismatch'
print('Missing values per column:')
print(combined.isna().sum())
print('Shape:', combined.shape)concat vs append (deprecato)
Il vecchio codice Pandas potrebbe usare df.append(other), un wrapper pratico per pd.concat(). Questo metodo è stato deprecato in Pandas 1.4 e rimosso in Pandas 2.0. Nel codice moderno usi sempre pd.concat([df, other], ignore_index=True). Il comportamento è identico, ma pd.concat è più esplicito e supporta la concatenazione di più di due DataFrame contemporaneamente.
# Old (removed in Pandas 2.0):
# combined = jan.append(feb, ignore_index=True)
# Modern equivalent:
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)Esempio pratico: report annuale delle vendite
Ecco un approccio realistico: caricare i DataFrame mensili, aggiungere un'etichetta di origine, concatenarli e calcolare un riepilogo dell'intero anno. Il parametro keys facilita il collegamento di ogni riga al proprio mese, mentre ignore_index=True, combinato con una colonna relativa al mese, produce un DataFrame piatto e ordinato per le analisi con raggruppamento.
months = ['jan', 'feb', 'mar']
frames = []
for m in months:
df = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
df['month'] = m
frames.append(df)
yearly = pd.concat(frames, ignore_index=True)
print(yearly.groupby('month')['sales'].sum())Verifica rapida
Verifichi la Sua comprensione di pd.concat per impilare i DataFrame, come illustrato in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato: come impilare i DataFrame verticalmente con pd.concat() e ignore_index=True, come tenere traccia delle origini usando il parametro keys e come join='inner' vs 'outer' controlla la gestione delle colonne quando gli schemi differiscono. Ora esploreremo pd.merge() per eseguire join interni ed esterni in stile SQL su colonne chiave condivise.
Domande Frequenti
La lezione «pd.concat per impilare DataFrame» è gratuita?
Sì — il testo completo di «pd.concat per impilare DataFrame» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «pd.concat per impilare DataFrame»?
Impili i DataFrame verticalmente o orizzontalmente con pd.concat, li allinei in base all'indice o alle colonne e gestisca gli indici duplicati. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «pd.concat per impilare DataFrame»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- pd.concat per impilare DataFrame
- pd.merge: join interno ed esterno
- Join sinistri e destri
- Eseguire join sull'indice