Vai al contenuto

2.3.3 - I/O in Pandas

Lettura di dati da sorgenti eterogenee

Nel nostro primo esempio abbiamo usato la funzione read_csv per creare un dataframe partendo dai dati memorizzati in un file in formato CSV. Tuttavia, Pandas supporta molti altri formati.

Ad esempio, potremmo provare a leggere un file Excel:

df = pd.read_excel('dati.xlsx')

Attenzione

Per leggere (e scrivere) da (su) Excel è necessario installare la libreria openpyxl (pip install openpyxl).

In alternativa, può essere letto un file in formato JSON, oppure ancora direttamente un database:

df = pd.read_json('dati.json')
df = pd.read_sql(SQL_QUERY)

Esiste un elenco completo delle (numerose) funzioni disponibili, che possono essere individuate sulla reference. In generale, comunque, la sintassi è sempre read_*(data_source), con * da sostituire con il tipo di sorgente dati (csv, excel, etc.).

Scrittura di dati su destinazioni eterogenee

Possiamo anche scrivere un dataframe su file mediante le funzioni duali alle read_, che usano il suffisso to_ seguito dall'estensione del file destinazione. Ad esempio, potremmo scrivere un file CSV con il metodo to_csv:

df.to_csv('train.xlsx')

Aggiunta di feature e dati

Immaginiamo adesso di voler aggiungere una nuova feature ad un dataframe già esistente. Per farlo, iniziamo creando un dataframe da zero:

>>> df = pd.DataFrame([1,2,3,4,5], columns=['one'])
   one
0    1
1    2
2    3
3    4
4    5

Possiamo aggiungere una nuova colonna semplicemente usando l'operatore di assegnazione e specificandone il nome:

>>> df['two'] = df['one'] * 2
   one  two
0    1    2
1    2    4
2    3    6
3    4    8
4    5   10

Possiamo poi inserire nuovi campioni in coda al dataframe. Per farlo, dovremo prima creare un nuovo dataframe dalle dimensioni coerenti con quello già esistente, e poi usare la funzione concat():

>>> df_add = pd.DataFrame([[6,7]], columns=['one', 'two'])
>>> df = pd.concat([df, df_add])
   one  two
0    1    2
1    2    4
2    3    6
3    4    8
4    5   10
0    6    7

Notiamo che la funzione concat() accetta, tra gli altri, il parametro axis. Se questo è uguale a zero (come lo è di default), la concat() effettua la concatenazione per righe; se è pari ad 1, invece, la concatenazione avviene per colonne. Tuttavia, è importante sottolineare come la concatenazione avvenga anche nel caso le misure non siano completamente coerenti: infatti, se provassimo ad effettuare una concatenazione per colonne, avremmo un risultato del tipo:

>>> pd.concat([df, df_add], axis=1)
   one  two  one  two
0    1    2  6.0  7.0
1    2    4  NaN  NaN
2    3    6  NaN  NaN
3    4    8  NaN  NaN
4    5   10  NaN  NaN

I valori relativi alle righe con indice che va da 1 a 4, che ovviamente non saranno presenti, saranno automaticamente impostati a NaN, acronimo di Not a Number.