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.
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.
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)

