class: center, middle # Pandas --- # Module Pandas * Pandas pour la manipulation de données de type : >* tabulées (SQL, Excel, ...), >* séries temporelles , >* matrices, >* données soumises aux traitements statistiques ... * À utiliser avec `numpy`. >* https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html --- # Module Pandas : création d'objets * Import de `numpy` & `pandas` : ```python >>> import numpy as np >>> import pandas as pd ``` * Création d'une
série
: ```python >>> s = pd.Series([1, 3, 5, np.nan, 6, 8]) # autorise les nan >>> s 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64 ``` --- # Module Pandas : création d'objets * À l'aide d'un _DataFrame_ convertion des données d'un dictionnaire en données tabulées : ```python >>> df2 = pd.DataFrame({'A': 1., ... 'B': pd.Timestamp('20130102'), ... 'C': pd.Series(1, index=list(range(4)), dtype='float32'), ... 'D': np.array([3] * 4, dtype='int32'), ... 'E': pd.Categorical(["test", "train", "test", "train"]), ... 'F': 'foo'}) >>> df2 A B C D E F 0 1.0 2013-01-02 1.0 3 test foo 1 1.0 2013-01-02 1.0 3 train foo 2 1.0 2013-01-02 1.0 3 test foo 3 1.0 2013-01-02 1.0 3 train foo ``` ```python >>> pd.Series(1, index=list(range(4)), dtype='float32') >>> # index permet de numéroter les lignes 0 1.0 1 1.0 2 1.0 3 1.0 dtype: float32 ``` --- # Module Pandas : création d'objets * Les colonnes du _DataFrame_ ont des types différents : ```python >>> df2.dtypes A float64 B datetime64[ns] C float32 D int32 E category F object dtype: object ``` --- # Module Pandas : création d'objets ```python >>> dates = pd.date_range('20130101', periods=6) >>> dates DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D') ``` ```python df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) >>> df A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 2013-01-04 0.174067 0.556952 -0.219398 0.403335 2013-01-05 0.367846 -0.390192 0.250073 0.310983 2013-01-06 0.089971 0.766604 -0.185695 0.158733 ``` --- # Module Pandas : visualisation - Haut du tableau ```python >>> df.head() A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 2013-01-04 0.174067 0.556952 -0.219398 0.403335 2013-01-05 0.367846 -0.390192 0.250073 0.310983 ``` - Bas du tableau ```python >>> df.tail() A B C D 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 2013-01-04 0.174067 0.556952 -0.219398 0.403335 2013-01-05 0.367846 -0.390192 0.250073 0.310983 2013-01-06 0.089971 0.766604 -0.185695 0.158733 ``` --- # Module Pandas : visualisation - Quelques statistiques descriptives ```python >>> df.describe() A B C D count 6.000000 6.000000 6.000000 6.000000 mean 0.030176 0.134285 0.163775 -0.346738 std 0.637691 0.646253 0.809841 1.072465 min -1.162811 -0.619901 -0.953694 -1.895890 25% 0.019373 -0.372628 -0.210972 -1.113268 50% 0.132019 0.118507 0.032189 0.234858 75% 0.319401 0.714191 0.610469 0.380247 max 0.716143 0.812185 1.360765 0.479679 ``` --- # Module Pandas : visualisation * Transposition : ```python >>> df.T 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06 A 0.716143 -0.004160 -1.162811 0.174067 0.367846 0.089971 B 0.812185 -0.619901 -0.319938 0.556952 -0.390192 0.766604 C 1.360765 0.730602 -0.953694 -0.219398 0.250073 -0.185695 D 0.479679 -1.537268 -1.895890 0.403335 0.310983 0.158733 ``` * Tri par colonne : ```python >>> df.sort_values('B') 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-05 0.367846 -0.390192 0.250073 0.310983 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 2013-01-04 0.174067 0.556952 -0.219398 0.403335 2013-01-06 0.089971 0.766604 -0.185695 0.158733 2013-01-01 0.716143 0.812185 1.360765 0.479679 ``` --- # Module Pandas : accès aux valeurs ```python >>> df A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 2013-01-04 0.174067 0.556952 -0.219398 0.403335 2013-01-05 0.367846 -0.390192 0.250073 0.310983 2013-01-06 0.089971 0.766604 -0.185695 0.158733 ``` - d'une colonne (sous forme d'une
Series
) : ```python >>> df['A'] 2013-01-01 0.716143 2013-01-02 -0.004160 2013-01-03 -1.162811 2013-01-04 0.174067 2013-01-05 0.367846 2013-01-06 0.089971 Freq: D, Name: A, dtype: float64 ``` --- # Module Pandas : accès aux valeurs ```python >>> df A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 2013-01-04 0.174067 0.556952 -0.219398 0.403335 2013-01-05 0.367846 -0.390192 0.250073 0.310983 2013-01-06 0.089971 0.766604 -0.185695 0.158733 ``` - d'une ligne à partir de son nom (sous forme d'une
Series
) : ```python >>> df.loc['2013-01-01'] A 0.716143 B 0.812185 C 1.360765 D 0.479679 ``` - d'une ligne à partir de son numéro (sous forme d'une
Series
) : ```python >>> df.iloc[0] A 0.716143 B 0.812185 C 1.360765 D 0.479679 ``` --- # Module Pandas : accès aux valeurs ```python >>> df A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 2013-01-04 0.174067 0.556952 -0.219398 0.403335 2013-01-05 0.367846 -0.390192 0.250073 0.310983 2013-01-06 0.089971 0.766604 -0.185695 0.158733 ``` - d'une valeur en particulier ```python >>> df['B']['2013-01-03'] -0.319938 ``` ```python >>> df.at['2013-01-03','B'] -0.319938 ``` --- # Modules Pandas : itérations ```python >>> df A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 ``` - sur les colonnes : ```python >>> for x in df: ... print(x) ... A B C D ``` - sur les lignes : ```python >>> for x in df.itertuples(): ... print(x.A) ... 0.716143 -0.004160 -1.162811 ``` --- # Module Pandas : ajout d'une colonne ```python >>> df A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 ``` ```python >>> df.assign(E=[-0.575142, 0.853726, -0.651291]) A B C D E 2013-01-01 0.716143 0.812185 1.360765 0.479679 -0.575142 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 0.853726 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 -0.651291 ```
Remarque :
la colonne `E` avec la méthode `assign` n'est pas persistante. ```python >>> df.insert(4, 'E', [-0.575142, 0.853726, -0.651291]) A B C D E 2013-01-01 0.716143 0.812185 1.360765 0.479679 -0.575142 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 0.853726 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 -0.651291 ```
Remarque :
le 1er argument d'`insert` est la localisation de la nouvelle colonne. --- # Module Pandas : suppression d'une colonne ```python >>> df A B C D E 2013-01-01 0.716143 0.812185 1.360765 0.479679 -0.575142 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 0.853726 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 -0.651291 ``` ```python >>> del df['E'] >>> df A B C D 2013-01-01 0.716143 0.812185 1.360765 0.479679 2013-01-02 -0.004160 -0.619901 0.730602 -1.537268 2013-01-03 -1.162811 -0.319938 -0.953694 -1.895890 ``` --- # Module Pandas : combinaison de
DataFrames
Combinaison de deux tableaux de chiffres à partir d'une colonne commune. ```python >>> df1 Sandra Thomas maths 19 15 francais 13 17 géographie 16 20 >>> df2 Franck Olivier maths 14 12 francais 11 18 histoire 17 14 ``` ```python >>> pd.concat([df1, df2]) Sandra Thomas Franck Olivier maths 19.0 15.0 NaN NaN francais 13.0 17.0 NaN NaN géographie 16.0 20.0 NaN NaN maths NaN NaN 14.0 12.0 francais NaN NaN 11.0 18.0 histoire NaN NaN 17.0 14.0 ```
Remarques :
`NaN` indique des valeurs manquantes ; lignes des deux
DataFrames
recopiées ! --- # Module Pandas : combinaison de
DataFrames
Ajout du paramètre `axis=1` pour ne pas recopier les lignes des deux
DataFrames
. ```python >>> pd.concat([df1, df2], axis=1) Sandra Thomas Franck Olivier maths 19.0 15.0 14.0 12.0 francais 13.0 17.0 11.0 18.0 géographie 16.0 20.0 NaN NaN histoire NaN NaN 17.0 14.0 ``` --- # Import / Export de fichiers CSV * Importer des données depuis un fichier CSV ```python df = pandas.read_csv("nom_fichier.csv", options...) ``` * Écrire un tableau dans un fichier CSV ```python df.to_csv("nom_fichier.csv", options...) ``` --- # Travaux pratiques Dans un script python nommé « `dataframe.py` » ou un notebook Jupyter « `dataframe.ipynb` », aidez-vous de la documentation en ligne sur Pandas pour créer un dataframe comme suit : ```python R1 R2 R3 R4 Lun 12 11 14 12 Mar 12 10 14 11 Mer 11 11 14 13 Jeu 18 23 23 17 Ven 17 22 21 17 Sam 16 20 22 16 Dim 18 25 22 17 ``` Affichez les informations suivantes : ```python Lun Mar Mer Jeu Ven Sam Dim count 4.000000 4.000000 4.00 4.000000 4.000000 4.0 4.000000 mean 12.250000 11.750000 12.25 20.250000 19.250000 18.5 20.500000 std 1.258306 1.707825 1.50 3.201562 2.629956 3.0 3.696846 min 11.000000 10.000000 11.00 17.000000 17.000000 16.0 17.000000 25% 11.750000 10.750000 11.00 17.750000 17.000000 16.0 17.750000 50% 12.000000 11.500000 12.00 20.500000 19.000000 18.0 20.000000 75% 12.500000 12.500000 13.25 23.000000 21.250000 20.5 22.750000 max 14.000000 14.000000 14.00 23.000000 22.000000 22.0 25.000000 ```