La libreria pandas, come viene spiegato nella sua pagina ufficiale, fornisce strutture e strumenti per l'analisi di dati in linguaggio Python.
Con questo articolo voglio solo presentarvi le feature più ovvie e banali della libreria, così che possiate prenderne in considerazione l'utilizzo in futuro.
Qui vi elenco le funzioni pandas che andremo a vedere in questa introduzione:
read_csv()
read_excel()
read_table()
to_csv()
append()
fillna()
corr()
describe()
Installazione
Per l'installazione sotto Linux, se non avete installato il pacchetto Anaconda come consigliato nel precedente articolo su Python, potete utilizzare il comando pip install come spiegato di seguito:
sudo apt-get install python-pip sudo pip install numpy sudo pip install pandas
Se il comando pip
non dovesse funzionare, vi consiglio di spulciare questa pagina.
Al termine dell'installazione, o se avete già il pacchetto Anaconda, digitate python
o ipython
sul vostro terminale e controllate che il seguente comando non vi dia errore:
import pandas
Creare un DataFrame
Se tutto è filato liscio fino a qui, possiamo continuare. Il cuore della libreria sono gli oggetti DataFrame
, strutture dati 2D indicizzati sia sulle colonne che sulle righe
E' possibile creare un oggetto DataFrame
a partire da zero utilizzando i metodi della libreria numpy
:
import pandas as pd import numpy as np rows = np.arange(3,9) cols = list('ABCDF') df = pd.DataFrame(np.random.randn(6,5),index=rows,columns=cols) print df
Dal print dell'oggetto possiamo notare due cose: la prima è che potete tranquillamente pensare un oggetto della classe DataFrame
esattamente come una tabella SQL; la seconda è che gli indici delle righe e delle colonne possono essere sostanzialmente qualsiasi cosa. In questo esempio infatti le righe sono indicizzate con numeri che vanno dal 3 all'8.
Se volete adesso fare riferimento ad una singola colonna vi basterà utilizzare un'istruzione del tipo:
column_labelB = df['B']
se volete invece fare riferimento a specifiche righe della tabella l'istruzione diventa:
rows_label45 = df.loc[4:5]
con il metodo loc
sono utilizzate le etichette delle righe; se intendete estrarre righe a seconda della loro posizione nella tabella, l'istruzione diventa:
rows_index13 = df.iloc[1:3]
Se provate a fare un print di rows_label45
e rows_index13
vedete che il risultato sarà lo stesso.
Caricare una tabella
La libreria vi permette di caricare un file .csv all'interno di un oggetto DataFrame
con la seguente istruzione:
import pandas as pd df = pd.read_csv('table.csv')
A questo punto potete visualizzare, affettare e filtrare il contenuto del file .csv semplicemente utilizzando i metodi e le istruzioni messe a disposizioni dalla libreria.
Visitate la pagina della documentazione del metodo per la lista completa dei parametri che potete aggiungere al path del file. Menzione speciale per il parametro sep
che vi permette di scegliere il tipo di separatore da utilizzare per il parsing del file, e per il parametro dtype
che vi permette di specificare il tipo delle colonne da caricate nel DataFrame
.
import pandas as pd df = pd.read_csv('table.csv', sep=';', dtype={'ID': str}) # ipotizzando che in 'table.csv' esista un campo 'ID' che deve essere letto come una stringa
Allo stesso modo potete caricare il contenuto di un file Excel all'interno di un oggetto DataFrame con read_excel()
. Ricordatevi sempre di ricontrollare le intestazioni degli oggetti DataFrame
creati in questo modo, così da essere certi che il caricamento sia andato a buon fine. Per stampare l'intestazione di un oggetto DataFrame
df
vi basterà digitare:
print list(df)
Il risultato di questa operazione è la lista delle etichette delle colonne.
Ricordatevi anche di controllare sempre prima il separatore decimale dei floating point utilizzato nei file. Se fosse diverso dal punto, utilizzate il parametro decimal
per leggere correttamente il file.
Se poi avete un file di testo generico, formattato coerentemente con un separatore delle colonne, potete utilizzare la funzione generica read_table()
.
Aggiungere/modificare righe
Ora che avete caricato o creato il vostro oggetto DataFrame
, potete modificare una cella della tabella semplicemente facendole riferimento in uno dei modi mostrati nel seguito:
import pandas as pd import numpy as np rows = np.arange(3,9) cols = list('ABCDF') df = pd.DataFrame(np.random.randn(6,5),index=rows,columns=cols) print df # modifichiamo la cella alla posizione riga '6' colonna 'B' df.loc[6]['B'] = 9999 # modifichiamo la cella alla posizione riga '3' (prima riga) colonna 'C' df.iloc[0]['C'] = 9999 print df
Potete anche impilare due DataFrame
con il metodo append
:
import pandas as pd import numpy as np rows = np.arange(3,9) cols = list('ABCDF') df1 = pd.DataFrame(np.random.randn(6,5),index=rows,columns=cols) df2 = pd.DataFrame(np.random.randn(6,5),index=rows,columns=cols) df = df1.append(df2,ignore_index=True) print df
Il parametro ignore_index
impostato a True
fa in modo che il nuovo DataFrame
df1
e df2
.
Se i due DataFrame
non sono consistenti con le colonne, il metodo append()
aggiungerà NaN
nelle colonne non presenti in entrambi i DataFrame
.
Se volete sostituire i NaN
con degli 0, vi basterà digitare:
df.fillna(0,inplace=True)
Rapida analisi di un DataFrame
Per ottenere informazioni statistiche rapide sul DataFrame
appena creato, esistono due funzioni molto interessanti: corr
che restituisce la matrice di correlazione di tutte le colonne numeriche del DataFrame
, e describe
che restituisce informazioni statistiche come media, mediana, minimo, massimo, varianza e altre, per ogni colonna numerica del DataFrame
.
import pandas as pd import numpy as np rows = np.arange(3,9) cols = list('ABCDF') print df.corr() print print df.describe() print print df.describe(percentiles=[0.25,0.75]) # con il parametro 'percentiles' potete aggiungere altre informazioni sui percentili da mostrare
Salvare una tabella in un file .csv
Ora che avete manipolato a vostro piacimento il DataFrame
df
, potete utilizzare la funzione to_csv()
per salvare il risultato in un file .csv:
df.to_csv('table.csv', sep=';', decimal=',', index=False)
Come spiegato in precedenza, il parametro decimal
serve a specificare il simbolo che sarà utilizzato per dividere i decimali nelle colonne float
della tabella. Il mio consiglio è che se dovete passare la tabella ad amici che non hanno confidenza con Excel, ricordatevi di impostare decimal=','
, cosicchè ci siano meno possibilità di avere una visualizzazione errata della tabella su Excel. Ricordatevi però di aggiungere il parametro quando dovete riaprire la tabella con pandas:
df = pd.read_csv('table.csv', sep=';', decimal=',')
Il parametro index
se impostato a False
fa in modo che non sia aggiunta la colonna degli indici nel file .csv; di default è impostato a True
.
Nel prossimo tutorial dedicato alla libreria pandas, vedremo come manipolare i DataFrame
in maniera simile al linguaggio SQL.
