Pandas
Una libreria per la manipolazione, analisi e visualizzazione dei dati, in particolare, offre strutture dati e operazioni per manipolare tabelle numeriche e serie temporali
Features: CSV (separato da virgola, TSV(separato da tab), file Excel, Database, ecc..
Sito ufficiale Pandas: www.pandas.pydata.org
Esempio - Iris Dataset
import pandas as pd from pandas.plotting import scatter_matrix import matplotlib.pyplot as plt df=pd.read_csv("iris.csv") scatter_matrix(df[df.Name=="Iris-virginica"]) plt.show()
Pandas fornisce due tipi di dato:
Series rappresentano dati 1D, come serie temporali (time series), output di funzioni ad una variabile, ecc.
DataFrame rappresenta dati 2D, come un file CSV (column-separated values), un microarray, una tabella di database, una matrice, ecc.
Pandas - tipi di dato
Ogni colonna di un DataFrame è una serie.
Ecco perchè vedremo prima come funzionano le Series
La maggior parte di ciò che diremo sulle Series si applica anche ai DataFrames
Series
Una Series è un vettore mono-dimensionale i cui elementi sono etichettati con un indice
In questo senso, la Series opera un pò come una lista (si possono accedere gli elementi in sequenza), e un pò come un dizionario (si può accedere ad un elemento tramite il suo indice, che opera come una chiave e non deve essere per forza numerico)
Creazione di Series
specificando dati e indici
s=pd.Series([2.5,3.6,5.7,5.8], index=[0,5,15,30]) 0 2.5 5 3.6 15 5.7 30 5.8 dtype: float64
specficando dati (indici numerici impliciti partendo da 0)
s=pd.Series([2.5,3.6,5.7,5.8]) 0 2.5 1 3.6 2 5.7 3 5.8 dtype: float64
passando un dizionario (le chiavi diventano gli indici e i valori i dati)
s=pd.Series({"a":342, "c":245, "g":546, "t":222}) a 342 c 245 g 546 t 222 dtype: int64
se viene fornito un singolo scalare, il costruttore della serie lo replicherà per tutti gli indici
s=pd.Series(3, index=range(5)) 0 3 1 3 2 3 3 3 4 3 dtype: int64
Accedere ad una Series
Si può accedere ad una Series sia tramite indice (come nei dizionari), sia tramite posizione (come nelle liste)
import pandas as pd s=pd.Series({"a":342,"c":245,"g":546,"t":222}) s["c"] # 245 s[0] # 342 s[-1] # 222 s[7] #IndexError: index out of bounds
Gli indici sono praticamente delle etichette associate alle posizioni corrispondenti, per cui si possono usare estrarre porzioni di Series (la sotto serie va da indice iniziale a indice finale compreso)
>>> s["c":"t"] >>> s[0:2] a 342 c 245 dtype: int64
E' anche possibile passare una lista di indici da estrarre
>>> s[["a","g"]] a 342 g 546 dtype: int64
Se un label non è contenuto, viene sollevata un'eccezione
Utilizzando il metodo get, un label mancante restituirà None o il valore predefinito specificato
import pandas as pd days=["mon","tue","wed","thu","fri"] sleephours=[6,2,8,5,9] s=pd.Series(sleephours, index=days) print(s["sat"]) print(s.get('sat') KeyError: 'sat' None
Metodi Head, Tail
I primi n elementi possono essere estratti usando head()
Gli ultimi n elementi possono essere estratti usando tail()
print(s.head(2)) print(s.tail(1)) a 342 c 245 dtype: int64 t 222 dtype: int64
Operazioni su Series
Le operazioni aritmetiche su una Series si applicano a tutti i suoi elementi (broadcasting)
s=pd.Series({"a":342,"c":245,"g":546,"t":222}) s+1 a 343 c 246 g 547 t 223 dtype: int64
Ovviamente possiamo farle anche sul singolo elem:
s['c'] += 1 s a 342 c 247 g 546 t 222 dtype: int64
Masking, filtering
Anche i test logici si applicano a tutti gli elementi (il risultato si chiama maschera, mask
Le maschere possono essere utilizzate per filtrare gli elementi di una serie in base a una determinata condizione
print(s>=300) print(s[s>=300]) a True a 342 c False g 546 g True dtype: int64 t False dtype: bool
Somma di due Series
La somma tra due serie le somma elemento per elemento, allineandole per indice
s+pd.Series({"a":1234,"g":3451}) a 1576.0 c NaN g 3997.0 t NaN dtype: float64
Se un indice non è presente in una delle serie, il risultato è NaN (non a number)
Esiste il metodo add() per cambiare valore di default (ad esempio 0 invece di NaN)
Statistiche con Series
s.max() s.var() s.std() s.median() s.corr(s) # Person corr. s.corr(s, method="spearman")
Plotting (matplotlib)
import matplolib.pyplot as plt #line plot #bar plot s.plot() s.plot(kind="bar") plt.show() plt.show()
DataFrame
Un DataFrame è praticamente una tabella di oggetti eterogenei
Un DataFrame ha indici sia per le righe che per le colonne
index rappresenta le etichette delle righe
columns rappresenta le etichette delle colonne
shape descrive le dimensioni della tabella
ogni colonna di un DataFrame è una Series
Tutte le operazioni viste per le serie possono essere applicate a colonne estratte da un DataFrame
Alcune possono essere applicate anche direttamente su un DataFrame
Creazione di un DataFrame
Da un dizionario di liste
d={'col1':[0.5,-2.1,2.3], 'col2': [0.6,-0.1,-0.9]} df=pd.DataFrame(d,index=['row1','row2','row3]) df col1 col2 row1 0.5 0.6 row2 -2.1 -0.1 row3 2.3 -0.9
Da una lista di dizionari (notare NaN)
d = [{"a":1,"b":2}, {"a":2,"c":3}, ] df=pd.DataFrame(d) df a b c 0 1 2.0 NaN 1 2 NaN 3.0
Da un dizionario di Pandas Series
d={"name": pd.Series(["Mario","Luigi"]), surname: pd.Series(["Rossi","Verdi"]) } df=pd.DataFrame(d) df name surname 0 Mario Rossi 1 Luigi Verdi
da un CSV
Consultare documentazione metodo read_csv
help(pd.read_csv)
Estrazione di righe e colonne
E' possibile accedere ad un estratto del DataFrame con il metodo head: df.head()
E' possibile estrarre tramite indici o posizioni di riga/colonna
df.loc[0] name Mario surname Rossi Name: 0, dtype: object df["name"] 0 Mario 1 Luigi 2 Marco Name: name, dtype: object df.loc[[0,1]] df.lc[0:1] name surname 0 Mario Rossi 1 Luigi Verdi df[["name","surname"]] name surname 0 Mario Rossi 1 Luigi Verdi
Operazioni e statistiche
Come per le Series
- Broadcasting
- Filtering
- Masking
df=pd.DataFrame(d) print(df["name"]=="Mario") 0 True 1 False Name: name, dtype: bool print(small[["Name","PetalLength","SepalLength"]] [small.PetalLength > small.PetalLength.mean()]) Name PetalLength SepalLength 114 Iris-virginica 5.1 5.8 62 Iris-versicolor 4.0 6.0 107 Iris-virginica 6.3 7.3
Merge
Il merge di DataFrames viene eseguito con la funzione merge()
Merge significa che, dati due tabelle con un nome di colonna comune, per prima cosa vengono abbinate le righe con lo stesso valore di colonna; quindi viene creata una nuova tabella concatenando le righe corrispondenti
Esempio, dati i seguenti due dataframe:
sequences=pd.DataFrame({ "id": ["Q99697", "018400", "P78337", "Q9W5Z2"], "seq": ["METNCR", "MDRSSA", "MDAFKG", "MTSMKD"], }) names=pd.DataFrame({ "id": ["Q99697", "018400", "P78337", "P59583"], "name": ["PITX2_HUMAN", "PITX_DROME", "PITX1_HUMAN", "WRK32_ARATH"], })
Merge: inner, left, right, outer...
Natural join: per mantenere solo le righe corrispondenti ai data frame, specifica l'argomento how="inner"
Full outer join: per mantenere tutte le righe di entrambi i data frame, specifica how="outer"
Left outer join: per includere tutte le righe del data frame x e solo quelle di y corrispondenti, specificare how="left"
Right outer join: per includere tutte le righe del data frame y e solo quelle di x corisspondenti, specificare how="right"
Group by
Il metodo groupby permette di eseguire operazioni su un gruppo di righe
>>> df=pd.DataFrame({'Animal': ['Falcon','Falcon','Parrot','Parrot'], 'Max Speed': [380.,370.,24.,26.]}) >>> df Animal Max Speed 0 Falcon 380.0 1 Falcon 370.0 2 Parrot 24.0 3 Parrot 26.0 >>> df.groupby(['Animal']).mean() Animal Max Speed Falcon 375.0 Parrot 25.0
Recommended Comments
There are no comments to display.