Pandas read_csv() in Python con l'esempio

โšก Riepilogo intelligente

La funzione `read_csv()` di Pandas converte un file CSV, locale o remoto, in un DataFrame con una singola chiamata. Questa guida illustra come importare il dataset del censimento degli adulti dell'UCI, assegnare un nome alle sue quindici colonne e riassumere il risultato con aggregazioni per gruppo.

  • ๐Ÿ”˜ Una sola chiamata: pd.read_csv() accetta un percorso file, un URL, o qualsiasi oggetto che esponga un metodo di lettura.
  • โ˜‘๏ธ Controllo delle colonne: Passa i nomi per etichettare le colonne e imposta index_col=False per mantenere un semplice indice intero.
  • โœ… Spazio bianco: skipinitialspace=True rimuove lo spazio che segue ogni virgola nel dataset degli adulti.
  • ๐Ÿงช Raggruppare e aggregare: La funzione groupby() riassume il frame con conteggio, minimo, massimo, media, mediana o deviazione standard.
  • ๏ธ File di grandi dimensioni: Le opzioni usecols, dtype e chunksize riducono i tempi di analisi e il consumo di memoria nelle esportazioni multigigabyte.
  • โš ๏ธ Errori comuni: La codifica, le righe errate e i tipi di dati misti hanno ciascuno un argomento documentato che li risolve.

Panda read_csv() con Esempio

Importa CSV in Panda

Durante il tutorial di TensorFlow, utilizzerai il set di dati sugli adulti, che viene spesso utilizzato per attivitร  di classificazione. Il file utilizzato di seguito รจ il raw adult.data esportare dal repository di apprendimento automatico UCI e la pagina del dataset offre anche un download compresso e il ucimlrepo pacchetto nel caso in cui il percorso diretto smetta di essere risolto.

I dati sono memorizzati in formato CSV. Il dataset include 8 variabili categoriche:

  • classe operaia
  • continua
  • coniugale
  • occupazione
  • rapporto
  • gara
  • sesso
  • Paese d'origine

E 6 variabili continue:

  • fnlwgt
  • numero_istruzione
  • plusvalenza
  • perdita_capitale
  • ore_settimana

Insieme al reddito label colonna, che crea i 15 nomi di colonna che passerai a Pandas nella prossima sezione.

Metodo read_csv() di Panda

Per importare un dataset CSV, รจ possibile utilizzare l'oggetto pd.read_csv(). La firma di base รจ:

Panda read_csv() Sintassi

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • percorso_file_o_buffer: sentiero, URL, o oggetto simile a un file che contiene i dati
  • sep=',': il delimitatore da utilizzare
  • nomi=Nessuno: Assegna un nome alle colonne. Se il dataset ha dieci colonne, devi specificare dieci nomi
  • index_col=Nessuno: quale colonna utilizzare come indice di riga. Passare False per forzare un nuovo indice intero
  • skipinitialspace=Falso: saltare gli spazi dopo il delimitatore

Per l'elenco completo degli argomenti, consultare il sito ufficiale. Documentazione di pandas_read_csv().

Panda read_csv() Esempio

Il frammento di codice seguente elenca tutte le 15 colonne, punta al file UCI ed elimina lo spazio che segue ogni virgola in questo specifico set di dati.

## Import csv
import pandas as pd
## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
           'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
           'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
df_train = pd.read_csv(PATH,
                       skipinitialspace=True,
                       names = COLUMNS,
                       index_col=False)
df_train.shape

Produzione:

(32561, 15)

La struttura conferma 32,561 righe e 15 colonne, quindi ogni nome in COLONNE รจ stato abbinato a un campo nel file.

Parametri chiave di Pandas read_csv()

La funzione read_csv() accetta piรน di cinquanta argomenti, ma un piccolo gruppo copre quasi tutte le importazioni effettive. I valori predefiniti riportati di seguito sono quelli documentati nell'attuale riferimento API di pandas.

Parametro Predefinito Ciรฒ che fa
settembre '' Carattere o espressione regolare utilizzata come delimitatore. Utilizzare sep=';' o sep='\t' per altri formati.
testata 'dedurre' Numero di riga contenente le etichette di colonna. Passa header=None se il file non ha una riga di intestazione.
nomi non impostato Elenco esplicito di etichette di colonna. Da combinare con header=0 per sostituire un'intestazione esistente.
indice_col Nona Colonna da utilizzare come indice di riga. index_col=False forza un indice intero semplice.
usecols Nona Sottoinsieme di colonne da caricare, in base all'etichetta o alla posizione. Riduce sia i tempi di analisi che l'utilizzo della memoria.
tipo d Nona Tipi di dati per colonna, ad esempio {'age': 'int32'}. Salta l'inferenza del tipo.
valori_na Nona Stringhe aggiuntive da leggere come NaN, come ad esempio il segnaposto '?' nel dataset degli adulti.
skiprows / nrows Nona Salta le righe iniziali oppure leggi solo le prime N righe di dati.
analizzare_le_date Nona Colonne da convertire in formato data e ora durante la lettura, abbinate al formato data.
codifica 'utf-8' Codifica del testo del file. Utilizzare 'latin-1' o 'cp1252' per le esportazioni legacy.
dimensione del pezzo Nona Restituisce un iteratore che restituisce il file in blocchi di N righe.
sulle linee cattive 'errore' Cosa fare con le righe non valide: alzarle, avvisarle o saltarle.

Due di questi meritano una menzione. index_col=False non รจ la stessa cosa di lasciarlo non impostato: dice esplicitamente a Pandas di non promuovere la prima colonna, che รจ quello che si desidera quando un file termina ogni riga con un delimitatore superfluo. E names sovrascrive silenziosamente qualsiasi cosa dichiari il file, quindi passa header=0 accanto ad esso quando il file CSV contiene effettivamente una riga di intestazione.

Metodo panda groupby()

Un modo semplice per visualizzare i dati รจ utilizzare il metodo groupby. Questo metodo consente di riepilogare i dati per gruppo. Di seguito รจ riportato un elenco delle aggregazioni disponibili con il metodo groupby():

  • contare: contare
  • minimo: minimo
  • massimo: massimo
  • significare: significare
  • mediano: mediano
  • deviazione standard: std
  • e altri

All'interno di groupby(), si specifica la colonna su cui si desidera raggruppare prima di applicare l'aggregazione.

Diamo un'occhiata a un singolo gruppoping con il dataset degli adulti. Otterrai la media di tutte le variabili continue per tipo di ricavo, ovvero superiore a 50 o inferiore a 50:

df_train.groupby(['label']).mean()
etichetta fnlwgt numero_istruzione plusvalenza perdita_capitale ore_settimana
<= 50K 36.783738 190340.86517 9.595065 148.752468 53.142921 38.840210
> 50K 44.249841 188005.00000 11.611657 4006.142456 195.001530 45.473026

รˆ possibile ottenere informazioni sull'etร  minima in base alla tipologia di nucleo familiare:

df_train.groupby(['label'])['age'].min()
label
<=50K    17
>50K     19
Name: age, dtype: int64

Puoi anche raggruppare per piรน colonne. Ad esempio, puoi ottenere la plusvalenza massima in base al tipo di nucleo familiare e allo stato civile.

df_train.groupby(['label', 'marital'])['capital_gain'].max()
label  marital
<=50K  Divorced                 34095
       Married-AF-spouse         2653
       Married-civ-spouse       41310
       Married-spouse-absent     6849
       Never-married            34095
       Separated                 7443
       Widowed                   6849
>50K   Divorced                 99999
       Married-AF-spouse         7298
       Married-civ-spouse       99999
       Married-spouse-absent    99999
       Never-married            99999
       Separated                99999
       Widowed                  99999
Name: capital_gain, dtype: int64

รˆ possibile creare un grafico dopo un'operazione di raggruppamento. Un modo per farlo รจ rappresentare graficamente direttamente il risultato del raggruppamento.

Per creare un grafico piรน chiaro, applica unstack() dopo mean() in modo che lo stato civile si sposti dall'indice alle colonne. Il grafico avrร  quindi due gruppi, uno per ogni etichetta di reddito, invece delle quattordici (2*7) barre che produrrebbe un indice multilivello piatto.

Se si utilizza un Jupyter TaccuinoRicorda di aggiungere %matplotlib inline, altrimenti non verrร  visualizzato alcun grafico.

%matplotlib inline
df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack()
df_plot

Rappresentando graficamente quel frame non sovrapposto come un grafico a barre si ottiene la figura seguente.

Grafico a barre raggruppate del guadagno medio in conto capitale per fascia di reddito e stato civile

Come leggere file CSV di grandi dimensioni con Pandas

Il dataset per adulti รจ di piccole dimensioni, ma la stessa chiamata puรฒ bloccarsi durante un'esportazione di diversi gigabyte. Tre argomenti svolgono la maggior parte del lavoro.

  • usecols carica solo le colonne effettivamente necessarie. La documentazione di pandas indica che ciรฒ si traduce in un'analisi sintattica molto piรน rapida e in un minore utilizzo della memoria.
  • tipo d Ogni colonna รจ associata a un tipo specifico, quindi Pandas salta l'inferenza e non espande gli interi a 64 bit per impostazione predefinita.
  • dimensione del pezzo Restituisce un TextFileReader anzichรฉ un DataFrame, consentendo di scorrere blocchi di N righe e di aggregare i dati man mano.
import pandas as pd

# read only the columns you need, with explicit types
cols  = ['age', 'education', 'capital_gain', 'label']
types = {'age': 'int32', 'capital_gain': 'int32'}
df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types,
                 skipinitialspace=True, index_col=False)

# stream the file in fixed-size chunks instead of loading it whole
total = 0
for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000,
                         skipinitialspace=True, index_col=False):
    total = total + len(chunk)
print(total)

Una volta impostate le basi, si possono aggiungere altre due opzioni. engine='pyarrow' passa al parser Arrow multithread e dtype_backend='pyarrow' mantiene il risultato in colonne con freccia. low_memory Il valore predefinito รจ True, il che significa che il file viene analizzato internamente a pezzi, ma puรฒ produrre tipi misti in una colonna; รจ preferibile impostare un tipo di dati esplicito piuttosto che affidarsi a questo valore.

Infine, il compression='infer' significa che un percorso che termina con .gz, .zip, .bz2, .xz o .zst viene decompresso al volo, quindi non รจ necessario estrarre un archivio prima di leggerlo.

Errori comuni nella funzione read_csv() di Pandas e come risolverli

La maggior parte degli errori di read_csv() deriva da quattro cause, e per ognuna di esse รจ presente un argomento documentato che ne consente la risoluzione.

Errore Causare Fissare
Errore FileNotFound Il percorso รจ relativo alla directory di lavoro, non allo script. Utilizzare un percorso assoluto o confermare il URL Lo schema puรฒ essere uno tra http, ftp, s3, gs o file.
Errore di decodifica Unicode Il file non รจ in formato UTF-8, che รจ la codifica predefinita. Passare encoding='latin-1' o il codec corretto, oppure encoding_errors='replace'.
ParserError: Errore durante la tokenizzazione dei dati Una riga contiene piรน campi di quelli dichiarati nell'intestazione. Passa on_bad_lines='skip' o 'warn' oppure imposta la separazione corretta.
DtypeWarning: le colonne hanno tipi misti L'inferenza del tipo a blocchi ha rilevato tipi diversi in una colonna. Imposta un tipo di dati esplicito oppure imposta low_memory=False.
Colonne spostate di una posizione Un delimitatore finale fa sรฌ che Pandas promuova il primo campo nell'indice. Passare index_col=False.

Il dataset per adulti mostra direttamente il caso dei valori mancanti: le voci relative a classe lavorativa, occupazione e paese di origine sconosciute vengono memorizzate come un punto interrogativo letterale, quindi vengono visualizzate come la stringa '?' a meno che non vengano dichiarate.

# tolerate rows with too many fields instead of raising
df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip')

# read a file that is not UTF-8
df = pd.read_csv('sales.csv', encoding='latin-1')

# treat the dataset's '?' placeholder as a missing value
df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

DOMANDE FREQUENTI

Entrambe le funzioni utilizzano lo stesso parser. `read_csv()` usa la virgola come delimitatore predefinito, mentre `read_table()` legge un file delimitato genericamente e richiede che tu imposti il โ€‹โ€‹separatore manualmente. Usa `read_csv()` per i file con separatore di virgola e `read_table()` per le esportazioni separate da tabulazioni o pipe.

Chiama df.to_csv('output.csv', index=False). Dropping L'indice evita che la prima colonna rimanga senza nome alla successiva lettura. Aggiungi gli argomenti sep, encoding o compression per replicare le impostazioni utilizzate durante l'importazione del file.

Passare `parse_dates` con i nomi o le posizioni delle colonne e aggiungere `date_format` quando il layout non รจ ISO 8601, ad esempio `date_format='%d/%m/%Y'`. Senza di esso, le colonne di date vengono ricevute come semplici stringhe oggetto e richiedono una chiamata separata a `to_datetime`.

Imposta sep sul carattere, ad esempio sep=';' o sep='\t'. I separatori piรน lunghi di un carattere vengono trattati come espressioni regolari e forzano la piรน lenta Python engine. sep=None consente a quel motore di rilevare il delimitatore dalla prima riga valida.

Utilizza `nrows` per limitare il numero di righe di dati restituite e `skiprows` per saltare un blocco di righe iniziali. Combinandoli, puoi scorrere un file, ad esempio impostando `skiprows=1000000` e `nrows=999999` per leggere il secondo milione di righe.

Sรฌ. La compressione รจ impostata di default su 'infer', quindi un percorso che termina con .gz, .zip, .bz2, .xz o .zst viene decompresso automaticamente. URLL'utilizzo di http, ftp, s3, gs o file funziona tutto correttamente e storage_options trasmette le credenziali al backend remoto.

I modelli addestrati segnalano probabili errori di battitura, raggruppano le categorie con ortografia quasi identica e imputano i valori mancanti dalle colonne circostanti. Ciรฒ riduce la pulizia manuale alle righe che un'impostazione basata su regole come na_values โ€‹โ€‹o dtype non รจ in grado di risolvere autonomamente.

Copilot genera rapidamente il codice di base non appena puรฒ visualizzare un esempio del file. Considera l'elenco degli argomenti come una bozza, perchรฉ spesso indovina il tipo di dati e la codifica. Verifica ogni parola chiave generata confrontandola con la documentazione dell'API di pandas prima di eseguirla.

Riassumi questo post con: