Jump to content
  • #4 Introduzione a Python: Pandas (Series e DataFrame)


     Share

    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

     

    6dfGwpL.png

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

     

    RWwcmvU.png

     

    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

     

     

     Share


    User Feedback

    Recommended Comments

    There are no comments to display.


×
×
  • Create New...

Important Information

Terms of Use Privacy Policy Guidelines We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.