{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "header": true }, "source": [ "
\n", "D. Malchiodi, Superhero data science. Vol 1: probabilità e statistica: Pandas.\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "
\n", "\n", "# Pandas\n", "Vedremo come la libreria pandas faciliti le operazioni viste finora per caricare dati, organizzarli in opportune strutture e analizzarli. Per poter procedere dobbiamo ricaricare le librerie usate finora, nonché il file `heroes.csv`. Useremo anche la _matplotlib magic_ che ci permette di visualizzare i grafici direttamente nel notebook." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import csv\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "plt.style.use('fivethirtyeight')\n", "plt.rc('figure', figsize=(5.0, 2.0))\n", "\n", "with open('data/heroes.csv', 'r') as heroes_file:\n", " heroes_reader = csv.reader(heroes_file, delimiter=';', quotechar='\"')\n", " heroes = list(heroes_reader)[1:]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Va notato come pandas (così come, in generale, gran parte del software open source dedicato all'analisi dei dati) sia caratterizzato da una comunità di sviluppatori molto attiva. Ciò significa che il tempo tra il rilascio di due release successive sia di norma breve: se avete effettuato l'installazione in modo autonomo è quindi possibile che stiate utilizzando una versione più (o meno) recente di quella più aggiornata quando è stato scritto questo documento. Per verificare quale sia la versione installata è sufficiente accedere alla proprietà `pd.__version__`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.1.3'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utilizzando una versione diversa da questa, può capitare che il risultato ottenuto eseguendo alcune celle sia diverso da quello indicato. Alcune funzionalità potrebbero anche non essere implementate, deprecate o perfino rimosse. Se state invece utilizzando l'ambiente fornito tramite immagine Docker o tramite mybinder non dovreste avere problemi di questo genere." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "
\n", "\n", "## Serie\n", "Una delle classi principali implementate in pandas è `Series`. Le sue istanze rappresentano serie di osservazioni di un certo carattere fatto su un insieme di individui. La cella seguente recupera dalla lista `heroes` precedentemente creata i nomi dei supereroi e il loro anno di prima apparizione e li utilizza per creare una serie:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "years = [int(h[7]) if h[7] else None for h in heroes]\n", "names = [h[0] for h in heroes]\n", "first_appearance = pd.Series(years, index = names)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nella creazione della lista `year` è stata utilizzata una list comprehension in cui l'espressione `int(h[7]) if h[7] else None` utilizza un operatore ternario tramite cui la stringa vuota viene trasformata nel valore speciale `None`, mentre tutte le altre vengono convertite nel corrispondente intero.\n", "\n", "La differenza tra una serie e una lista o una tupla è legata alla possibilità di invocare su di essa delle funzioni specifiche. Inoltre a ogni serie è associato un *indice* che permette di identificare ogni elemento osservato. Nell'esempio sopra riportato, il primo argomento specificato nel costruttore è una lista (ma sarebbe andata bene anche una tupla) di anni che indicano la prima apparizione di un supereroe e il secondo rappresenta appunto l'indice, che in questo caso è la lista dei corrispondenti nomi. Quando si visualizza una serie, ogni osservazione viene associata al corrispondente elemento usando appunto l'indice:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A-Bomb 2008.0\n", "Abraxas NaN\n", "Abomination NaN\n", "Adam Monroe NaN\n", "Agent 13 NaN\n", " ... \n", "Alan Scott 1940.0\n", "Amazo 1960.0\n", "Ant-Man 1962.0\n", "Ajax 1998.0\n", "Alex Mercer NaN\n", "Length: 735, dtype: float64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La visualizzazione della serie (che in questo caso riporta solo i primi e gli ultimi elementi perché la serie è troppo lunga) termina indicando il tipo di dato usato per rappresentare le varie osservazioni. Nell'esempio precedente viene utilizzato il tipo `float64` (pandas utilizza internamente gli array di numpy, in cui è presente un'implementazione dei tipi in virgola mobile diversa da quella standard di python), nonostante i dati originari fossero numeri interi. Ciò è dovuto alla presenza di valori mancanti. Di norma vengono indicati con la sigla NA (dall'inglese \"not available\"), ma in pandas essi vengono rappresentati utilizzando il concetto di \"not a number\" dello standard IEEE per la virgola mobile: si noti come tutte le occorrenze di `None` nella lista originale siano state automaticamente convertite in `np.nan`.\n", "\n", "L'accesso ai dati contenuti in una serie può avvenire in due modi:\n", "- specificando un valore per l'indice tra parentesi quadre dopo la serie o dopo la sua proprietà `loc`:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1941.0, 1941.0)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(first_appearance['Wonder Woman'], first_appearance.loc['Wonder Woman'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- indicando un valore per la posizione tra parentesi quadre dopo la serie o dopo la sua proprietà `iloc`:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1992.0, 1992.0)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(first_appearance[128], first_appearance.iloc[128])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Se l'indice di una serie è basato su valori interi, i valori tra parentesi quadre immediatamente dopo la serie faranno riferimento all'indice e non alla posizione: ciò potrebbe essere fuorviante se gli elementi dell'indice non partono da zero e non sono consecutivi.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "È inoltre possibile utilizzare una notazione simile al _list slicing_ specificando valori dell'indice oppure posizioni. Va però notato che gli _slicing_ basati su indice comprenderanno il primo e l'ultimo valore specificato:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Wonder Girl 1996.0\n", "Wonder Woman 1941.0\n", "dtype: float64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance['Wonder Girl':'Wonder Woman']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "mentre gli _slice_ basati su posizione escluderanno l'ultimo elemento:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Vegeta NaN\n", "Vixen 1981.0\n", "Valkyrie NaN\n", "dtype: float64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance[60:63]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L'accesso posizionale può anche fare riferimento a numeri negativi, contando in analogia a liste e tuple a partire dall'ultimo elemento:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Alan Scott 1940.0\n", "Amazo 1960.0\n", "Ant-Man 1962.0\n", "Ajax 1998.0\n", "Alex Mercer NaN\n", "dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance[-5:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "È possibile accedere ai primi e ultimi elementi di una serie anche utilizzando le funzioni `head` e `tail`, che mostrano rispettivamente solo le prime e le ultime righe:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A-Bomb 2008.0\n", "Abraxas NaN\n", "Abomination NaN\n", "Adam Monroe NaN\n", "Agent 13 NaN\n", "Air-Walker NaN\n", "Agent Bob 2007.0\n", "dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance.head(7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L'accesso alle liste può anche essere fatto specificando una lista (ma non una tupla) di posizioni al posto di una sola posizione, con l'effetto di ottenere i corrispondenti elementi." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Abraxas NaN\n", "Warbird NaN\n", "Astro Boy NaN\n", "dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance[[1, 42, 709]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Questo tipo di accesso può essere fatto anche specificando una lista di valori per l'indice. Infine, si può utilizzare una lista di valori booleani in cui `True` indica gli elementi da estrarre e `False` quelli da filtrare:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Thundra 1972.0\n", "Swamp Thing 1972.0\n", "Shang-Chi 1973.0\n", "Rambo 1972.0\n", "Ra's Al Ghul 1971.0\n", "Namorita 1972.0\n", "Mockingbird 1971.0\n", "Metron 1971.0\n", "Man-Bat 1970.0\n", "Man-Thing 1971.0\n", "Luke Cage 1972.0\n", "Jennifer Kale 1972.0\n", "Iron Fist 1974.0\n", "Ghost Rider 1972.0\n", "Etrigan 1972.0\n", "Drax the Destroyer 1973.0\n", "Diamondback 1972.0\n", "Doc Samson 1971.0\n", "Darkseid 1970.0\n", "Deathlok 1974.0\n", "Brother Voodoo 1973.0\n", "Blade 1973.0\n", "dtype: float64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance[[1970 <= y <1975 for y in first_appearance]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "L'uso di questa modalità di accesso richiede che la lista di valori booleani abbia la stessa lunghezza della serie. L'uso di liste di dimensioni minori l'accesso, che comporta un filtraggio effettuato solo nei primi elementi della serie, è deprecato e va quindi evitato. \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Infine, è possibile effettuare delle _query_ su una serie specificando tra parentesi quadre un'espressione logica che indica quali elementi visualizzare, utilizzando la serie come simbolo che ne indica un suo generico elemento:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Venompool 2011.0\n", "The Cape 2011.0\n", "Spider-Man 2011.0\n", "Simon Baz 2012.0\n", "Rey 2015.0\n", "Kylo Ren 2015.0\n", "Jyn Erso 2016.0\n", "K-2SO 2016.0\n", "Jessica Cruz 2013.0\n", "Garbage Man 2011.0\n", "Evil Deadpool 2011.0\n", "Captain Cold 2012.0\n", "Bloodhawk 2099.0\n", "dtype: float64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance[first_appearance > 2010]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Tecnicamente, l'espressione `first_appearance > 2010` genera una nuova serie che ha lo stesso indice di `first_appearance` e in cui i valori sono `True` in corrispondenza degli anni successivi al 2010 e `False` altrimenti. Questa nuova serie viene utilizzata per filtrare `first_appearance`.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vediamo ora come utilizzando le serie sia molto più semplice calcolare e visualizzare le frequenze assolute: il metodo `value_counts` restituisce un'altra serie in cui gli indici sono i valori osservati e i valori le corrispondenti frequenze assolute, ordinate in senso non crescente." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1964.0 18\n", "1963.0 18\n", "1965.0 14\n", "2004.0 11\n", "1976.0 10\n", " ..\n", "1939.0 1\n", "1956.0 1\n", "1978.0 1\n", "1983.0 1\n", "2013.0 1\n", "Length: 71, dtype: int64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_appearance.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Va notato come il tipo delle frequenze sia, correttamente, intero e come i valori mancanti siano automaticamente esclusi dal calcolo delle frequenze, mentre sono sempre presenti gli _outlier_. Per ottenere una serie i cui elementi siano ordinati per valore non decrescente della voce nell'indice è sufficiente invocare il metodo `sort_index`; già che ci siamo, è un buon momento per eliminare i valori fuori scala dal conteggio effettuando una _query_ sulla serie:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1933.0 1\n", "1939.0 1\n", "1940.0 9\n", "1941.0 7\n", "1943.0 2\n", "1944.0 2\n", "1945.0 1\n", "1947.0 2\n", "1948.0 1\n", "1950.0 1\n", "dtype: int64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_app_freq = first_appearance[first_appearance < 2090].value_counts().sort_index()\n", "first_app_freq.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "
\n", "\n", "## Visualizzazione grafica di una serie\n", "Pandas mette a disposizione l'oggetto `plot` per visualizzare graficamente i contenuti di una serie, utilizzando matplotlib dietro le quinte; in particolare, il metodo `bar` visualizza un grafico a barre:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Don't try this at home (men che meno all'esame!)\n", "\n", "first_appearance.plot.bar()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il grafico ottenuto, diciamolo, fa schifo. Questo perché `bar` considera un punto per ogni elemento della serie, in cui le ascisse corrispondono alla posizione (zero per la prima osservazione, uno per la seconda e così via, sebbene nel grafico sull'asse delle ascisse vengano poi visualizzati i valori dell'indice) e le ordinate al valore osservato. Per ognuno dei punti così ottenuti viene poi tracciato un segmento che lo congiunge perpendicolarmente all'asse delle ascisse. Il risultato è decisamente poco informativo, sia da un punto di vista grafico (le etichette sull'asse delle ascisse si sovrappongono, così che non si riesce a leggere nulla), sia da un punto di vista analitico: le barre hanno altezze simili e quindi le loro differenze sono poco apprezzabili a colpo d'occhio; inoltre il grafico dipende per esempio dall'ordine in cui sono elencate le osservazioni e non ci permette di solito di trarre alcuna informazione sulla relazione che lega tra loro le osservazioni.\n", "\n", "Si ottengono dei risultati decisamente più interessanti se si visualizza un grafico analogo per le frequenze assolute:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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b7+lCRMm2NitaqXOl19+SYsWLSKDwUBms5nGjx9P+fn5NGvWLDKZTGQ2myklJYU2bdpEw4cPJ71eX2074+PjKTQ0lObMmUPPPfec+HJ26tSJlixZQrfcckulK3zsfZw+fTrt3r2brrvuOvFH4rHHHqOYmBix0sc+FnFxcTY+63Q6atasGf3888/C5xkzZtDu3btp9erVlJSURKGhoRQTE0Nvv/02vfzyyyLWN998M/3000907733Vrkqqbz/27Ztox9//JFMJhMBoFdeeYW6d+9OsiyTxWIhrVZLEydOJEVRaNGiRaTVaqlly5aUk5NDp06douTkZNLpdBQfH08zZswgPz8/mj59uuiPjuI8evRoAkD+/v60ePFiGjRokPhj50z/Kt8PANCjjz4qVgVarVYyGAw0evRoys/Pp9mzZ5PRaKSgoCDatGkTbd++nWJiYshoNFKrVq3o0UcftekXNfG5IfuFJEnUr18/OnHiBL3xxhskyzK1atWKunTpQl26dKH4+HgCQAkJCdSlSxdKSEggANSuXTt6++236e2336b7779fxHjy5MkUHR1NsizTL7/8QoqiUEREBD3wwAMEgA4ePEh79uwRfUmSJEpNTaVXX32VZFmmoKAg+uyzz0hRFFq/fj1JkkSenp509uxZUpS/NiqKjIykyMhIkVCtVquoU5Pw+PHjad++fSJmBw8eJEVRKDo6mgDQzp07SVEUCg0Npccff5xat24trlVmZqbN/hONIgkHBwfT6tWrSVEUOnLkCEmSRF5eXrR+/XpSlL820tDr9XTixAlSFIVmzZolLo76UQNv/6Xo3bs3bd26ld5//30CQGvXriWtVkvNmzenKVOmkCRJIoj//Oc/CQDp9XqyWCw0bNgwcQeg7gi1bds2kmVZ2N21a5dYJlvertFopO3bt5OiKOTt7U2SJImLU1BQQBqNhgCIdm7btk2c29l2lm9r9+7dqaCgQNyhJSUlCf/Utms0GlqxYgXFxcWRTqcT/gUFBdHzzz9v06Heeecdh7Hw9vaus8/qtWnXrh2dOHGCdu7cKf6QHDp06Opyzf/dLWq1WmrRogXNnz+fLBYLZWVliZiW93fnzp103333iXN16dKFPvjgAwJACxcuFP1t8+bNBEBs3vLuu+9W8LcynyMiImjQoEF06NAhEffq+pd9Pyjv81dffUW9e/cmAGQ2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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "first_app_freq.plot.bar()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il grafico ottenuto è sicuramente migliore di quello precedente, ma rimane il problema di leggibilità dell'asse delle ascisse. Ciò è dovuto al fatto che pandas non inserisce le barre sul grafico nelle ascisse corrispondenti agli anni, ma le posiziona una accanto all'altra, come possiamo renderci conto visualizzando un po' meglio solo alcune delle etichette (in prima istanza non è importante capire come venga generato questo grafico, ma se siete cursori potete leggere l'approfondimento che trovate dopo il commento al grafico stesso):" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "years = np.arange(1945, 2010, 10)\n", "index_pos = [first_app_freq.index.get_loc(y) for y in years]\n", "first_app_freq.plot.bar()\n", "plt.xticks(index_pos, years)\n", "plt.ylim((0, 18.5))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si può osservare che tra due valori successivi evidenziati nell'asse delle ascisse intercorre una distanza di dieci anni, ma le etichette non risultano equispaziate: ciò è dovuto al fatto che in realtà la prima barra ha ascissa 1, la seconda ha ascissa 2 e così via, mentre le etichette mostrate sull'asse delle ascisse corrispondono ai valori degli indici.\n", "\n", "
\n", "Per generare il grafico precedente è necessario utilizzare alcune funzionalità avanzate delle librerie considerate: `np.arange` permette di costruire un array i cui valori vanno di dieci in dieci partendo da 1945 e arrivando a 2005; la proprietà `index` di una serie permette di estrarne l'indice e il metodo `get_loc` di quest'ultimo restituisce la posizione corrispondente a un dato valore dell'indice. Infine, il metodo `xticks` di matplotlib permette di specificare quali valori evidenziare sull'asse delle ascisse e quali etichette utilizzare.\n", "
\n", "\n", "Per ottenere un grafico simile in cui le ascisse siano effettivamente gli anni di prima apparizione è necessario tornare a utilizzare esplicitamente matplotlib, passando al metodo `bar` rispettivamente l'indice e i valori della serie, che si ottengono rispettivamente utilizzando la proprietà `index` e invocando il metodo `get_values`." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.bar(first_app_freq.index, first_app_freq.values)\n", "plt.xlim((1935, 2015))\n", "plt.ylim(0, 18.5)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "
\n", "\n", "## Operazioni con le serie\n", "Consideriamo le seguenti domande:\n", "\n", "1. Quanti supereroi sono apparsi a partire dal 1960?\n", "2. Quanti tra il 1940 e il 1965?\n", "3. Quanti prima del 1970?\n", "\n", "Per rispondere alla prima domanda dobbiamo isolare le frequenze che corrispondono agli anni di apparizione che vanno dal 1960 in avanti. Notiamo che l'indice della serie contiene i valori degli anni; è quindi possibile utilizzare l'accesso tramite *list slicing* per recuperare le frequenze degli anni di apparizione che vanno dal 1960 in avanti:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "1960.0 8\n", "1961.0 3\n", "1962.0 4\n", "1963.0 18\n", "1964.0 18\n", "1965.0 14\n", "1966.0 6\n", "1967.0 8\n", "1968.0 5\n", "1969.0 2\n", "1970.0 2\n", "1971.0 5\n", "1972.0 9\n", "1973.0 4\n", "1974.0 2\n", "1975.0 10\n", "1976.0 10\n", "1977.0 10\n", "1978.0 1\n", "1979.0 9\n", "1980.0 9\n", "1981.0 8\n", "1982.0 2\n", "1983.0 1\n", "1984.0 6\n", "1985.0 9\n", "1986.0 10\n", "1987.0 9\n", "1988.0 1\n", "1989.0 5\n", "1990.0 4\n", "1991.0 5\n", "1992.0 9\n", "1993.0 10\n", "1994.0 10\n", "1995.0 5\n", "1996.0 2\n", "1997.0 4\n", "1998.0 4\n", "1999.0 5\n", "2000.0 3\n", "2001.0 3\n", "2003.0 4\n", "2004.0 11\n", "2005.0 7\n", "2006.0 7\n", "2007.0 5\n", "2008.0 6\n", "2009.0 1\n", "2010.0 4\n", "2011.0 5\n", "2012.0 2\n", "2013.0 1\n", "2015.0 2\n", "2016.0 2\n", "dtype: int64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_app_freq[1960:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A questo punto è sufficiente invocare la funzione `sum` sulla sotto-serie individuata per ottenere la somma delle frequenze:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "329" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(first_app_freq[1960:])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La seconda domanda trova risposta in modo analogo, filtrando le frequenze degli anni di apparizione tra il 1940 e il 1965 (l'estremo destro del list slicing è incluso nel risultato, dato che è un'operazione sull'indice):" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(first_app_freq[1940:1965])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analogamente, all'ultima domanda si risponde selezionando gli anni fino al 1969:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "123" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(first_app_freq[:1969])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "La funzione `sum` accetta come argomento liste, tuple e serie: in tutti i casi restituisce la somma dei valori in esse contenute.\n", "
\n", "\n", "Un modo alternativo per calcolare la somma dei valori in una serie è quella di invocare su di essa l'omonimo metodo `sum`. Le serie sono inoltre in tutto e per tutto dei vettori, sui quali è possibile effettuare operazioni algebriche. Consideriamo per esempio le due serie contenenti altezza e peso dei supereroi:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "height = pd.Series([float(h[4]) if h[4] else None for h in heroes], index=names)\n", "weight = pd.Series([float(h[5]) if h[5] else None for h in heroes], index=names)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una prima categoria di operazioni è quella che si ottiene indicando il nome di una serie all'interno di un'espressione aritmetica: il risultato è una nuova serie ottenuta calcolando l'espressione su tutti gli elementi della serie di partenza. Per esempio, la cella seguente crea la serie contenente l'altezza degli eroi misurata in metri e ne visualizza i primi dieci elementi:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A-Bomb 2.0321\n", "Abraxas NaN\n", "Abomination 2.0304\n", "Adam Monroe NaN\n", "Agent 13 1.7341\n", "Air-Walker 1.8859\n", "Agent Bob 1.7825\n", "Abe Sapien 1.9124\n", "Abin Sur 1.8552\n", "Angela NaN\n", "dtype: float64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(height/100)[:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quando si considerano operazioni più complicate, è possibile utilizzare il metodo `apply` indicando come suo argomento la funzione da applicare agli elementi della serie. Per esempio, nella cella seguente viene creata una nuova serie ottenuta esprimendo le altezze dei supereroi in metri e successivamente elevando il risultato al quadrato." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A-Bomb 4.129430\n", "Abraxas NaN\n", "Abomination 4.122524\n", "Adam Monroe NaN\n", "Agent 13 3.007103\n", "Air-Walker 3.556619\n", "Agent Bob 3.177306\n", "Abe Sapien 3.657274\n", "Abin Sur 3.441767\n", "Angela NaN\n", "dtype: float64" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "height.apply(lambda h: (h/100)**2)[:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Un'altra importante categoria di operazioni è quella che vede due serie indicate come argomenti di un operatore aritmetico binario. In questo caso verrà ancora creata una nuova serie, in cui l'operazione viene calcolata elemento per elemento nelle serie indicate. Per esempio, la cella seguente crea una nuova serie `bmi` contenente l'indice di massa corporea (BMI) dei supereroi (ottenuto dividendo il peso specificato in chilogrammi per il quadrato dell'altezza misurata in metri), e mostra i quindici supereroi con il BMI più elevato." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Utgard-Loki 2501.321629\n", "Giganta 1607.124545\n", "Red Hulk 137.611973\n", "Darkseid 114.366701\n", "Machine Man 114.083519\n", "Thanos 109.414534\n", "Destroyer 107.579152\n", "Abomination 107.211015\n", "A-Bomb 107.024446\n", "Hulk 105.622909\n", "Bloodaxe 104.160435\n", "Juggernaut 103.216295\n", "King Kong 102.732873\n", "Sasquatch 96.810738\n", "Living Brain 91.318046\n", "dtype: float64" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bmi = weight / height.apply(lambda h: (h/100)**2)\n", "bmi.sort_values(ascending=False)[:15]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A parte notare Hulk è solo il quindicesimo della classifica, va sottolineato che le operazioni fatte elemento per elemento allineano i vettori corrispondenti alle serie in base all'indice (e non alla posizione). Consideriamo per esempio la seguente cella, in cui vengono selezionati altezze e pesi più o meno plausibili per un essere umano, calcolando poi i corrispondenti BMI." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A-Bomb NaN\n", "Abe Sapien 17.868501\n", "Abin Sur 26.410852\n", "Abomination NaN\n", "Absorbing Man NaN\n", "Adam Strange 25.952943\n", "Agent 13 20.295282\n", "Agent Bob 25.634923\n", "Agent Zero NaN\n", "Air-Walker NaN\n", "Ajax 24.245355\n", "Alan Scott 27.725061\n", "Alfred Pennyworth 22.966566\n", "Ammo NaN\n", "Angel 20.589542\n", "dtype: float64" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "standard_weight = weight[(weight < 100) & (weight > 40)]\n", "standard_height = height[(height < 210) & (height > 120)]/100\n", "(standard_weight / (standard_height**2))[:15]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si nota un numero relativamente elevato di `NaN`, e ciò è appunto dovuto al fatto che il rapporto alla base del calcolo del BMI viene fatto usando peso e altezza di valori che hanno lo stesso indice. Ora, non è detto che un supereroe che ha un peso plausibile abbia anche un'altezza plausibile, e viceversa. Quello che succede quando si esegue un'operazione tra due serie e solo una di essa è definita in corrispondenza di uno specifico valore dell'indice, il risultato conterrà `NaN` per quel valore." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "
\n", "\n", "## Dataframe\n", "Un _dataframe_ è una collezione di serie che hanno lo stesso indice, ed è quindi un insieme di osservazioni di vari _caratteri_ per una popolazione di individui. Tra i vari modi che sono disponibili in pandas per creare un _dataframe_, noi faremo riferimento al metodo `read_csv` della classe `pd.DataFrame`, che permette di leggere i contenuti di un file in formato CSV e convertirli automaticamente in un _dataframe_." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "heroes = pd.read_csv('data/heroes.csv', sep=';', index_col=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usando lo stesso file a cui abbiamo fatto riferimento nei paragrafi precedenti, è stato necessario utilizzare l'argomento opzionale `sep` per indicare il carattere usato per separare i campi in ogni record. La visualizzazione dei dataframe viene automaticamente formattata in un formato tabellare facile da leggere se si utilizza jupyter:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IdentityBirth placePublisherHeightWeightGenderFirst appearanceEye colorHair colorStrengthIntelligence
Name
A-BombRichard Milhouse JonesScarsdale, ArizonaMarvel Comics203.21441.95M2008.0YellowNo Hair100.0moderate
AbraxasAbraxasWithin EternityMarvel ComicsNaNNaNMNaNBlueBlack100.0high
AbominationEmil BlonskyZagreb, YugoslaviaMarvel Comics203.04441.98MNaNGreenNo Hair80.0good
Adam MonroeNaNNaNNBC - HeroesNaNNaNMNaNBlueBlond10.0good
Agent 13Sharon CarterNaNMarvel Comics173.4161.03FNaNBlueBlondNaNNaN
Air-WalkerGabriel LanXandar, a planet in the Tranta system, Androme...Marvel Comics188.59108.23MNaNBlueWhite85.0average
Agent BobBobNaNMarvel Comics178.2581.45M2007.0BrownBrown10.0low
Abe SapienAbraham SapienNaNDark Horse Comics191.2465.35M1993.0BlueNo Hair30.0high
Abin SurNaNUngaraDC Comics185.5290.90M1959.0BlueNo Hair90.0average
AngelaNaNNaNImage ComicsNaNNaNFNaNNaNNaN100.0high
Animal ManBernhard BakerNaNDC Comics183.8083.39M1965.0BlueBlond50.0average
Agent ZeroChristoph NordUnrevealed location in former East GermanyMarvel Comics191.29104.17MNaNNaNNaN30.0good
Colin WagnerNaNNaNHarperCollinsNaNNaNMNaNGreyBrownNaNNaN
Angel DustChristinaNaNMarvel Comics165.7857.21FNaNYellowBlack55.0moderate
Angel SalvadoreAngel Salvadore BohuskNaNMarvel Comics163.5754.67F2001.0BrownBlack10.0moderate
ZoomHunter ZolomonNaNDC Comics185.9081.93MNaNRedBrown10.0average
Lady DeathstrikeYuriko OyamaOsaka, JapanMarvel Comics175.8558.89F1985.0BrownBlack30.0good
YodaYodaNaNGeorge Lucas66.2917.01M1980.0BrownWhite55.0high
ZatannaZatanna ZataraNaNDC Comics170.2957.77FNaNBlueBlack10.0high
Yellowjacket IIRita DeMaraNaNMarvel Comics165.5852.36FNaNBlueStrawberry Blond10.0average
YellowjacketHank PymElmsford, New YorkMarvel Comics183.0383.71MNaNBlueBlond10.0high
Yellow ClawNaNSomewhere in mainland ChinaMarvel Comics188.4095.09MNaNBlueNo HairNaNNaN
Absorbing ManCarl CreelNew York City, New YorkMarvel Comics193.36122.28M1964.0BlueNo Hair80.0moderate
X-ManNate GreyAmerican Northeast of Earth-295Marvel Comics175.8261.80M1995.0BlueBrown55.0high
X-23Laura KinneyThe Facility, location unrevealedMarvel Comics155.6150.39FNaNGreenBlack25.0good
WondraNaNNaNMarvel ComicsNaNNaNFNaNNaNNaNNaNNaN
Adam StrangeAdam StrangeChicago, IllinoisDC Comics185.1088.92M1986.0BlueBlond10.0good
Wonder GirlCassandra Elizabeth SandsmarkNaNDC Comics165.7451.33F1996.0BlueBlond90.0good
Wonder WomanDiana PrinceThemysciraDC Comics183.1374.74F1941.0BlueBlack100.0high
WolverineLoganAlberta, CanadaMarvel Comics160.70135.21MNaNBlueBlack35.0good
....................................
ArdinaArdinaNaNMarvel Comics193.9898.68FNaNWhiteOrange100.0good
ArclightPhilippa SontagVietnamMarvel Comics173.4357.25F1986.0VioletPurple65.0moderate
AresNaNNaNMarvel Comics185.28270.30MNaNBrownBrown85.0good
ArchangelWarren Kenneth Worthington IIICenterport, Long Island, New YorkMarvel Comics183.8268.63M1963.0BlueBlond15.0good
Astro BoyAtomNaNNaNNaNNaNMNaNBrownBlack95.0average
Atom IIIAdam CrayNaNDC ComicsNaNNaNMNaNNaNRedNaNNaN
AqualadGarthPoseidonis, AtlantisDC Comics178.89106.83M1960.0BlueBlack45.0good
ArielArielNaNMarvel Comics165.3559.17F1987.0PurplePink10.0average
AquababyArthur Curry, Jr.NaNDC ComicsNaNNaNM1965.0BlueBlond20.0low
AquamanOrinAtlantisDC Comics185.71146.96M1941.0BlueBlond85.0high
ApocalypseEn Sabah NurAkkaba, EgyptMarvel Comics213.77135.62M1986.0RedBlack100.0high
Anti-MonitorNaNMoon of QwardDC Comics61.37NaNMNaNYellowNo Hair100.0high
Ant-Man IIScott LangCoral Gables, FloridaMarvel Comics183.6786.28M1979.0BlueBlond20.0good
Anti-VenomEddie BrockSan Francisco, CaliforniaMarvel Comics229.46358.05MNaNBlueBlond60.0good
Anti-SpawnJason WynnNaNImage ComicsNaNNaNMNaNNaNNaN60.0good
AnnihilusAnnihilusPlanet of Arthros, Sector 17A, Negative ZoneMarvel Comics180.9490.11M1968.0GreenNo Hair80.0good
AngelWarren Kenneth Worthington IIICenterport, Long Island, New YorkMarvel Comics183.0568.99M1969.0BlueBlond15.0good
AmmoNaNNaNMarvel Comics188.93101.09M1988.0BrownBlackNaNNaN
ArachneJulia CarpenterLos Angeles, CaliforniaMarvel Comics175.1563.75FNaNBlueBlond50.0average
AngelLiamNaNDark Horse ComicsNaNNaNMNaNNaNNaN30.0good
Allan QuatermainNaNNaNWildstormNaNNaNMNaNNaNNaNNaNNaN
AlienXenomorphYour chest :)Dark Horse Comics244.30169.66M1979.0NaNNo Hair30.0average
Alfred PennyworthAlfred Thaddeus Crane PennyworthNaNDC Comics178.2672.98M1943.0BlueBlack10.0good
Ando MasahashiAndo MasahashiNaNNBC - HeroesNaNNaNMNaNNaNNaNNaNNaN
Alex WoolslyAlex WoolslyNaNNBC - HeroesNaNNaNMNaNNaNNaN40.0average
Alan ScottAlan Ladd Wellington ScottGotham CityDC Comics180.9890.81M1940.0BlueBlond80.0good
AmazoNaNNaNDC Comics257.49173.95M1960.0RedNaN100.0good
Ant-ManHank PymElmsford, New YorkMarvel Comics211.74122.44M1962.0BlueBlond20.0high
AjaxFrancisNaNMarvel Comics193.3490.63M1998.0BrownBlack50.0average
Alex MercerAlexander J. MercerNaNWildstormNaNNaNMNaNNaNNaN80.0average
\n", "

735 rows × 11 columns

\n", "
" ], "text/plain": [ " Identity \\\n", "Name \n", "A-Bomb Richard Milhouse Jones \n", "Abraxas Abraxas \n", "Abomination Emil Blonsky \n", "Adam Monroe NaN \n", "Agent 13 Sharon Carter \n", "Air-Walker Gabriel Lan \n", "Agent Bob Bob \n", "Abe Sapien Abraham Sapien \n", "Abin Sur NaN \n", "Angela NaN \n", "Animal Man Bernhard Baker \n", "Agent Zero Christoph Nord \n", "Colin Wagner NaN \n", "Angel Dust Christina \n", "Angel Salvadore Angel Salvadore Bohusk \n", "Zoom Hunter Zolomon \n", "Lady Deathstrike Yuriko Oyama \n", "Yoda Yoda \n", "Zatanna Zatanna Zatara \n", "Yellowjacket II Rita DeMara \n", "Yellowjacket Hank Pym \n", "Yellow Claw NaN \n", "Absorbing Man Carl Creel \n", "X-Man Nate Grey \n", "X-23 Laura Kinney \n", "Wondra NaN \n", "Adam Strange Adam Strange \n", "Wonder Girl Cassandra Elizabeth Sandsmark \n", "Wonder Woman Diana Prince \n", "Wolverine Logan \n", "... ... \n", "Ardina Ardina \n", "Arclight Philippa Sontag \n", "Ares NaN \n", "Archangel Warren Kenneth Worthington III \n", "Astro Boy Atom \n", "Atom III Adam Cray \n", "Aqualad Garth \n", "Ariel Ariel \n", "Aquababy Arthur Curry, Jr. \n", "Aquaman Orin \n", "Apocalypse En Sabah Nur \n", "Anti-Monitor NaN \n", "Ant-Man II Scott Lang \n", "Anti-Venom Eddie Brock \n", "Anti-Spawn Jason Wynn \n", "Annihilus Annihilus \n", "Angel Warren Kenneth Worthington III \n", "Ammo NaN \n", "Arachne Julia Carpenter \n", "Angel Liam \n", "Allan Quatermain NaN \n", "Alien Xenomorph \n", "Alfred Pennyworth Alfred Thaddeus Crane Pennyworth \n", "Ando Masahashi Ando Masahashi \n", "Alex Woolsly Alex Woolsly \n", "Alan Scott Alan Ladd Wellington Scott \n", "Amazo NaN \n", "Ant-Man Hank Pym \n", "Ajax Francis \n", "Alex Mercer Alexander J. Mercer \n", "\n", " Birth place \\\n", "Name \n", "A-Bomb Scarsdale, Arizona \n", "Abraxas Within Eternity \n", "Abomination Zagreb, Yugoslavia \n", "Adam Monroe NaN \n", "Agent 13 NaN \n", "Air-Walker Xandar, a planet in the Tranta system, Androme... \n", "Agent Bob NaN \n", "Abe Sapien NaN \n", "Abin Sur Ungara \n", "Angela NaN \n", "Animal Man NaN \n", "Agent Zero Unrevealed location in former East Germany \n", "Colin Wagner NaN \n", "Angel Dust NaN \n", "Angel Salvadore NaN \n", "Zoom NaN \n", "Lady Deathstrike Osaka, Japan \n", "Yoda NaN \n", "Zatanna NaN \n", "Yellowjacket II NaN \n", "Yellowjacket Elmsford, New York \n", "Yellow Claw Somewhere in mainland China \n", "Absorbing Man New York City, New York \n", "X-Man American Northeast of Earth-295 \n", "X-23 The Facility, location unrevealed \n", "Wondra NaN \n", "Adam Strange Chicago, Illinois \n", "Wonder Girl NaN \n", "Wonder Woman Themyscira \n", "Wolverine Alberta, Canada \n", "... ... \n", "Ardina NaN \n", "Arclight Vietnam \n", "Ares NaN \n", "Archangel Centerport, Long Island, New York \n", "Astro Boy NaN \n", "Atom III NaN \n", "Aqualad Poseidonis, Atlantis \n", "Ariel NaN \n", "Aquababy NaN \n", "Aquaman Atlantis \n", "Apocalypse Akkaba, Egypt \n", "Anti-Monitor Moon of Qward \n", "Ant-Man II Coral Gables, Florida \n", "Anti-Venom San Francisco, California \n", "Anti-Spawn NaN \n", "Annihilus Planet of Arthros, Sector 17A, Negative Zone \n", "Angel Centerport, Long Island, New York \n", "Ammo NaN \n", "Arachne Los Angeles, California \n", "Angel NaN \n", "Allan Quatermain NaN \n", "Alien Your chest :) \n", "Alfred Pennyworth NaN \n", "Ando Masahashi NaN \n", "Alex Woolsly NaN \n", "Alan Scott Gotham City \n", "Amazo NaN \n", "Ant-Man Elmsford, New York \n", "Ajax NaN \n", "Alex Mercer NaN \n", "\n", " Publisher Height Weight Gender First appearance \\\n", "Name \n", "A-Bomb Marvel Comics 203.21 441.95 M 2008.0 \n", "Abraxas Marvel Comics NaN NaN M NaN \n", "Abomination Marvel Comics 203.04 441.98 M NaN \n", "Adam Monroe NBC - Heroes NaN NaN M NaN \n", "Agent 13 Marvel Comics 173.41 61.03 F NaN \n", "Air-Walker Marvel Comics 188.59 108.23 M NaN \n", "Agent Bob Marvel Comics 178.25 81.45 M 2007.0 \n", "Abe Sapien Dark Horse Comics 191.24 65.35 M 1993.0 \n", "Abin Sur DC Comics 185.52 90.90 M 1959.0 \n", "Angela Image Comics NaN NaN F NaN \n", "Animal Man DC Comics 183.80 83.39 M 1965.0 \n", "Agent Zero Marvel Comics 191.29 104.17 M NaN \n", "Colin Wagner HarperCollins NaN NaN M NaN \n", "Angel Dust Marvel Comics 165.78 57.21 F NaN \n", "Angel Salvadore Marvel Comics 163.57 54.67 F 2001.0 \n", "Zoom DC Comics 185.90 81.93 M NaN \n", "Lady Deathstrike Marvel Comics 175.85 58.89 F 1985.0 \n", "Yoda George Lucas 66.29 17.01 M 1980.0 \n", "Zatanna DC Comics 170.29 57.77 F NaN \n", "Yellowjacket II Marvel Comics 165.58 52.36 F NaN \n", "Yellowjacket Marvel Comics 183.03 83.71 M NaN \n", "Yellow Claw Marvel Comics 188.40 95.09 M NaN \n", "Absorbing Man Marvel Comics 193.36 122.28 M 1964.0 \n", "X-Man Marvel Comics 175.82 61.80 M 1995.0 \n", "X-23 Marvel Comics 155.61 50.39 F NaN \n", "Wondra Marvel Comics NaN NaN F NaN \n", "Adam Strange DC Comics 185.10 88.92 M 1986.0 \n", "Wonder Girl DC Comics 165.74 51.33 F 1996.0 \n", "Wonder Woman DC Comics 183.13 74.74 F 1941.0 \n", "Wolverine Marvel Comics 160.70 135.21 M NaN \n", "... ... ... ... ... ... \n", "Ardina Marvel Comics 193.98 98.68 F NaN \n", "Arclight Marvel Comics 173.43 57.25 F 1986.0 \n", "Ares Marvel Comics 185.28 270.30 M NaN \n", "Archangel Marvel Comics 183.82 68.63 M 1963.0 \n", "Astro Boy NaN NaN NaN M NaN \n", "Atom III DC Comics NaN NaN M NaN \n", "Aqualad DC Comics 178.89 106.83 M 1960.0 \n", "Ariel Marvel Comics 165.35 59.17 F 1987.0 \n", "Aquababy DC Comics NaN NaN M 1965.0 \n", "Aquaman DC Comics 185.71 146.96 M 1941.0 \n", "Apocalypse Marvel Comics 213.77 135.62 M 1986.0 \n", "Anti-Monitor DC Comics 61.37 NaN M NaN \n", "Ant-Man II Marvel Comics 183.67 86.28 M 1979.0 \n", "Anti-Venom Marvel Comics 229.46 358.05 M NaN \n", "Anti-Spawn Image Comics NaN NaN M NaN \n", "Annihilus Marvel Comics 180.94 90.11 M 1968.0 \n", "Angel Marvel Comics 183.05 68.99 M 1969.0 \n", "Ammo Marvel Comics 188.93 101.09 M 1988.0 \n", "Arachne Marvel Comics 175.15 63.75 F NaN \n", "Angel Dark Horse Comics NaN NaN M NaN \n", "Allan Quatermain Wildstorm NaN NaN M NaN \n", "Alien Dark Horse Comics 244.30 169.66 M 1979.0 \n", "Alfred Pennyworth DC Comics 178.26 72.98 M 1943.0 \n", "Ando Masahashi NBC - Heroes NaN NaN M NaN \n", "Alex Woolsly NBC - Heroes NaN NaN M NaN \n", "Alan Scott DC Comics 180.98 90.81 M 1940.0 \n", "Amazo DC Comics 257.49 173.95 M 1960.0 \n", "Ant-Man Marvel Comics 211.74 122.44 M 1962.0 \n", "Ajax Marvel Comics 193.34 90.63 M 1998.0 \n", "Alex Mercer Wildstorm NaN NaN M NaN \n", "\n", " Eye color Hair color Strength Intelligence \n", "Name \n", "A-Bomb Yellow No Hair 100.0 moderate \n", "Abraxas Blue Black 100.0 high \n", "Abomination Green No Hair 80.0 good \n", "Adam Monroe Blue Blond 10.0 good \n", "Agent 13 Blue Blond NaN NaN \n", "Air-Walker Blue White 85.0 average \n", "Agent Bob Brown Brown 10.0 low \n", "Abe Sapien Blue No Hair 30.0 high \n", "Abin Sur Blue No Hair 90.0 average \n", "Angela NaN NaN 100.0 high \n", "Animal Man Blue Blond 50.0 average \n", "Agent Zero NaN NaN 30.0 good \n", "Colin Wagner Grey Brown NaN NaN \n", "Angel Dust Yellow Black 55.0 moderate \n", "Angel Salvadore Brown Black 10.0 moderate \n", "Zoom Red Brown 10.0 average \n", "Lady Deathstrike Brown Black 30.0 good \n", "Yoda Brown White 55.0 high \n", "Zatanna Blue Black 10.0 high \n", "Yellowjacket II Blue Strawberry Blond 10.0 average \n", "Yellowjacket Blue Blond 10.0 high \n", "Yellow Claw Blue No Hair NaN NaN \n", "Absorbing Man Blue No Hair 80.0 moderate \n", "X-Man Blue Brown 55.0 high \n", "X-23 Green Black 25.0 good \n", "Wondra NaN NaN NaN NaN \n", "Adam Strange Blue Blond 10.0 good \n", "Wonder Girl Blue Blond 90.0 good \n", "Wonder Woman Blue Black 100.0 high \n", "Wolverine Blue Black 35.0 good \n", "... ... ... ... ... \n", "Ardina White Orange 100.0 good \n", "Arclight Violet Purple 65.0 moderate \n", "Ares Brown Brown 85.0 good \n", "Archangel Blue Blond 15.0 good \n", "Astro Boy Brown Black 95.0 average \n", "Atom III NaN Red NaN NaN \n", "Aqualad Blue Black 45.0 good \n", "Ariel Purple Pink 10.0 average \n", "Aquababy Blue Blond 20.0 low \n", "Aquaman Blue Blond 85.0 high \n", "Apocalypse Red Black 100.0 high \n", "Anti-Monitor Yellow No Hair 100.0 high \n", "Ant-Man II Blue Blond 20.0 good \n", "Anti-Venom Blue Blond 60.0 good \n", "Anti-Spawn NaN NaN 60.0 good \n", "Annihilus Green No Hair 80.0 good \n", "Angel Blue Blond 15.0 good \n", "Ammo Brown Black NaN NaN \n", "Arachne Blue Blond 50.0 average \n", "Angel NaN NaN 30.0 good \n", "Allan Quatermain NaN NaN NaN NaN \n", "Alien NaN No Hair 30.0 average \n", "Alfred Pennyworth Blue Black 10.0 good \n", "Ando Masahashi NaN NaN NaN NaN \n", "Alex Woolsly NaN NaN 40.0 average \n", "Alan Scott Blue Blond 80.0 good \n", "Amazo Red NaN 100.0 good \n", "Ant-Man Blue Blond 20.0 high \n", "Ajax Brown Black 50.0 average \n", "Alex Mercer NaN NaN 80.0 average \n", "\n", "[735 rows x 11 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ci riferiremo spesso alle righe e alle colonne di un _dataframe_ per indicare rispettivamente le osservazioni e i caratteri. Per esempio la prima riga si riferisce all'osservazione relativa ad \"A-Bomb\", mentre la prima colonna corrisponde al carattere \"identity\". Vi sono molti modi per interagire con un _dataframe_:\n", "\n", "- l'insieme degli indici, dei caratteri e dei valori si ottengono, nell'ordine, alle proprietà `index`, `columns` e `values`;\n", "- una serie corrispondente a una colonna/carattere può essere selezionata usando una sintassi simile a quella dei dizionari, specificando il nome del carattere come chiave:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Name\n", "A-Bomb M\n", "Abraxas M\n", "Abomination M\n", "Adam Monroe M\n", "Agent 13 F\n", " ..\n", "Alan Scott M\n", "Amazo M\n", "Ant-Man M\n", "Ajax M\n", "Alex Mercer M\n", "Name: Gender, Length: 735, dtype: object" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes['Gender']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "In alternativa è possibile usare una sintassi basata su _dot notation_ in cui il nome della colonna, senza essere racchiuso tra apici, segue il _dataframe_. In altre parole, `heroes['Gender']` e `heroes.Gender` sono equivalenti. Questa seconda notazione è però utilizzabile solamente se non vi sono spazi nei nomi delle colonne. Nel seguito utilizzeremo quindi sempre la prima delle due notazioni.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- tramite uno _slicing_ sulle posizioni o sui valori dell'indice è possibile selezionare un sottoinsieme delle righe del _dataframe_ (e come nel caso delle serie, l'estremo superiore è incluse se si usano gli indici ed escluso se si usano le posizioni):" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IdentityBirth placePublisherHeightWeightGenderFirst appearanceEye colorHair colorStrengthIntelligence
Name
Agent 13Sharon CarterNaNMarvel Comics173.4161.03FNaNBlueBlondNaNNaN
Air-WalkerGabriel LanXandar, a planet in the Tranta system, Androme...Marvel Comics188.59108.23MNaNBlueWhite85.0average
\n", "
" ], "text/plain": [ " Identity Birth place \\\n", "Name \n", "Agent 13 Sharon Carter NaN \n", "Air-Walker Gabriel Lan Xandar, a planet in the Tranta system, Androme... \n", "\n", " Publisher Height Weight Gender First appearance Eye color \\\n", "Name \n", "Agent 13 Marvel Comics 173.41 61.03 F NaN Blue \n", "Air-Walker Marvel Comics 188.59 108.23 M NaN Blue \n", "\n", " Hair color Strength Intelligence \n", "Name \n", "Agent 13 Blond NaN NaN \n", "Air-Walker White 85.0 average " ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes['Agent 13':'Air-Walker']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Queste modalità di accesso possono effettivamente creare confusione: usando una sintassi molto simile, specificando un valore si accede a una colonna e specificando uno _slice_ si accede a un insieme di righe. Per scrivere codice più chiaro è meglio selezionare le righe utilizzando le proprietà `loc` e `iloc` nello stesso modo in cui queste funzionano per le serie, con la differenza che quando queste sono usate specificando un solo valore, viene restituita una serie, e quando sono utilizzate con uno _slice_ o con una lista viene restituito un _dataframe_." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Identity Charles Francis Xavier\n", "Birth place New York, New York\n", "Publisher Marvel Comics\n", "Height 183.74\n", "Weight 86.89\n", "Gender M\n", "First appearance 1963\n", "Eye color Blue\n", "Hair color No Hair\n", "Strength 10\n", "Intelligence high\n", "Name: Professor X, dtype: object" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.loc['Professor X']" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IdentityBirth placePublisherHeightWeightGenderFirst appearanceEye colorHair colorStrengthIntelligence
Name
WarbirdCarol DanversBoston, MassachusettsMarvel Comics180.5654.75FNaNBlueBlondNaNNaN
WildfireDrake BurroughsNaNDC ComicsNaNNaNMNaNNaNNaN35.0average
VultureAdrian ToomesStaten Island, New York CityMarvel Comics180.6179.63MNaNBrownNo Hair25.0good
WarpEmil LaSalleNaNDC Comics173.4267.42M1981.0BrownBlack10.0moderate
\n", "
" ], "text/plain": [ " Identity Birth place Publisher \\\n", "Name \n", "Warbird Carol Danvers Boston, Massachusetts Marvel Comics \n", "Wildfire Drake Burroughs NaN DC Comics \n", "Vulture Adrian Toomes Staten Island, New York City Marvel Comics \n", "Warp Emil LaSalle NaN DC Comics \n", "\n", " Height Weight Gender First appearance Eye color Hair color \\\n", "Name \n", "Warbird 180.56 54.75 F NaN Blue Blond \n", "Wildfire NaN NaN M NaN NaN NaN \n", "Vulture 180.61 79.63 M NaN Brown No Hair \n", "Warp 173.42 67.42 M 1981.0 Brown Black \n", "\n", " Strength Intelligence \n", "Name \n", "Warbird NaN NaN \n", "Wildfire 35.0 average \n", "Vulture 25.0 good \n", "Warp 10.0 moderate " ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.iloc[42:46]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "È inoltre possibile selezionare una o più righe e visualizzare solo un sottoinsieme dei caratteri, passando a `loc` o `iloc` un secondo argomento in cui si specificano i caratteri da mostrare, utilizzando anche in questo caso un valore, una lista di valori oppure uno _slice_:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Height 183.74\n", "Weight 86.89\n", "Name: Professor X, dtype: object" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.loc['Professor X', 'Height':'Weight']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Va notato che `loc` accetta solo valori simbolici, mentre `iloc` solamente posizioni, e ciò riguarda anche il loro secondo argomento:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
HeightWeight
Name
Tempest163.0254.36
Supergirl165.4054.80
\n", "
" ], "text/plain": [ " Height Weight\n", "Name \n", "Tempest 163.02 54.36\n", "Supergirl 165.40 54.80" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.iloc[[106, 103], [3, 4]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Volendo accedere direttamente a un elemento è possibile utilizzare le proprietà `at` e `iat`:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100.0" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.at['Superman', 'Strength']" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'high'" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.iat[500, -1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "È anche possibile utilizzare `loc` e `iloc` per estrarre un singolo elemento: per esempio, `heroes.loc['Superman', 'Strength']` equivale alla prima delle due istruzioni appena elencate. Tuttavia, `at` e `iat` sono implementate in modo da essere più efficienti.\n", "
\n", "\n", "È infine possibile riordinare le righe di un dataframe invocando i metodi `sort_values` e `sort_index`: il primo basa l'ordinamento sul valore di una colonna, il cui nome va specificato tramite l'argomento `by` e il secondo è invece basato sui valori dell'indice. È inoltre possibile indicare un valore booleano per l'argomento `ascending` che permette di ordinare in verso crescente o decrescente." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IdentityBirth placePublisherHeightWeightGenderFirst appearanceEye colorHair colorStrengthIntelligence
Name
SasquatchWalter LangkowskiEdmonton, Alberta, CanadaMarvel Comics305.02900.70MNaNRedOrange80.0good
JuggernautCain MarkoBerkeley, CaliforniaMarvel Comics287.95855.82M1965.0BlueRed100.0average
DarkseidUxasNaNDC Comics267.37817.57M1970.0RedNo Hair100.0high
HulkBruce BannerDayton, OhioMarvel Comics244.40630.90M1962.0GreenGreen100.0high
GigantaDoris ZuelNaNDC Comics62.65630.80F1944.0GreenRed90.0high
\n", "
" ], "text/plain": [ " Identity Birth place Publisher \\\n", "Name \n", "Sasquatch Walter Langkowski Edmonton, Alberta, Canada Marvel Comics \n", "Juggernaut Cain Marko Berkeley, California Marvel Comics \n", "Darkseid Uxas NaN DC Comics \n", "Hulk Bruce Banner Dayton, Ohio Marvel Comics \n", "Giganta Doris Zuel NaN DC Comics \n", "\n", " Height Weight Gender First appearance Eye color Hair color \\\n", "Name \n", "Sasquatch 305.02 900.70 M NaN Red Orange \n", "Juggernaut 287.95 855.82 M 1965.0 Blue Red \n", "Darkseid 267.37 817.57 M 1970.0 Red No Hair \n", "Hulk 244.40 630.90 M 1962.0 Green Green \n", "Giganta 62.65 630.80 F 1944.0 Green Red \n", "\n", " Strength Intelligence \n", "Name \n", "Sasquatch 80.0 good \n", "Juggernaut 100.0 average \n", "Darkseid 100.0 high \n", "Hulk 100.0 high \n", "Giganta 90.0 high " ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.sort_values(by='Weight', ascending=False)[:5]" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IdentityBirth placePublisherHeightWeightGenderFirst appearanceEye colorHair colorStrengthIntelligence
Name
Yellowjacket IIRita DeMaraNaNMarvel Comics165.5852.36FNaNBlueStrawberry Blond10.0average
YmirYmirNiffleheimMarvel Comics304.63NaNMNaNWhiteNo Hair100.0average
YodaYodaNaNGeorge Lucas66.2917.01M1980.0BrownWhite55.0high
ZatannaZatanna ZataraNaNDC Comics170.2957.77FNaNBlueBlack10.0high
ZoomHunter ZolomonNaNDC Comics185.9081.93MNaNRedBrown10.0average
\n", "
" ], "text/plain": [ " Identity Birth place Publisher Height Weight \\\n", "Name \n", "Yellowjacket II Rita DeMara NaN Marvel Comics 165.58 52.36 \n", "Ymir Ymir Niffleheim Marvel Comics 304.63 NaN \n", "Yoda Yoda NaN George Lucas 66.29 17.01 \n", "Zatanna Zatanna Zatara NaN DC Comics 170.29 57.77 \n", "Zoom Hunter Zolomon NaN DC Comics 185.90 81.93 \n", "\n", " Gender First appearance Eye color Hair color \\\n", "Name \n", "Yellowjacket II F NaN Blue Strawberry Blond \n", "Ymir M NaN White No Hair \n", "Yoda M 1980.0 Brown White \n", "Zatanna F NaN Blue Black \n", "Zoom M NaN Red Brown \n", "\n", " Strength Intelligence \n", "Name \n", "Yellowjacket II 10.0 average \n", "Ymir 100.0 average \n", "Yoda 55.0 high \n", "Zatanna 10.0 high \n", "Zoom 10.0 average " ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes.sort_index()[-5:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Va notato che entrambi i metodi restituiscono una copia del _dataframe_. Anche per i _dataframe_ è possibile utilizzare una lista di valori booleani che identificano le righe da selezionare, e tale lista può essere prodotta effettuando una query. In questo caso però le condizioni possono riguardare le varie colonne, ognuna delle quali va specificata usando una delle due sintassi precedentemente introdotte (quella analoga ai dizionari oppure quella basata su _dot notation_). Per esempio possiamo selezionare gli eroi per cui l'anno di apparizione esiste e rappresenta un valore non fuori scala nel modo seguente:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IdentityBirth placePublisherHeightWeightGenderFirst appearanceEye colorHair colorStrengthIntelligence
Name
A-BombRichard Milhouse JonesScarsdale, ArizonaMarvel Comics203.21441.95M2008.0YellowNo Hair100.0moderate
Agent BobBobNaNMarvel Comics178.2581.45M2007.0BrownBrown10.0low
Abe SapienAbraham SapienNaNDark Horse Comics191.2465.35M1993.0BlueNo Hair30.0high
Abin SurNaNUngaraDC Comics185.5290.90M1959.0BlueNo Hair90.0average
Animal ManBernhard BakerNaNDC Comics183.8083.39M1965.0BlueBlond50.0average
\n", "
" ], "text/plain": [ " Identity Birth place Publisher \\\n", "Name \n", "A-Bomb Richard Milhouse Jones Scarsdale, Arizona Marvel Comics \n", "Agent Bob Bob NaN Marvel Comics \n", "Abe Sapien Abraham Sapien NaN Dark Horse Comics \n", "Abin Sur NaN Ungara DC Comics \n", "Animal Man Bernhard Baker NaN DC Comics \n", "\n", " Height Weight Gender First appearance Eye color Hair color \\\n", "Name \n", "A-Bomb 203.21 441.95 M 2008.0 Yellow No Hair \n", "Agent Bob 178.25 81.45 M 2007.0 Brown Brown \n", "Abe Sapien 191.24 65.35 M 1993.0 Blue No Hair \n", "Abin Sur 185.52 90.90 M 1959.0 Blue No Hair \n", "Animal Man 183.80 83.39 M 1965.0 Blue Blond \n", "\n", " Strength Intelligence \n", "Name \n", "A-Bomb 100.0 moderate \n", "Agent Bob 10.0 low \n", "Abe Sapien 30.0 high \n", "Abin Sur 90.0 average \n", "Animal Man 50.0 average " ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heroes_with_year = heroes[heroes['First appearance'] > 1900]\n", "heroes_with_year.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "footer": true }, "source": [ "
\n", "D. Malchiodi, Superhero data science. Vol 1: probabilità e statistica: Pandas, 2017.\n", "
\n", "Powered by \"Jupyter\n", "
\n", "\n", "\n", "\n", "\n", "Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 4.0 Internazionale.\n", "
" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" }, "latex_envs": { "LaTeX_envs_menu_present": false, "autoclose": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": true, "user_envs_cfg": true }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": false, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }