Introduction à Pandas pour l'analyse de données
Introduction à Pandas pour l'analyse de données
com/panda-python/
[Link]
python : Pandas
I) Introduction
Le module pandas a été conçu pour l’analyse de données, tâche principale des Data
Analysts ou les Business Analysts en entreprise. Il est particulièrement puissant pour
manipuler des données structurées sous forme de tableau.
Sous son nom d’animal, Pandas est une bibliothèque puissante et polyvalente qui
permet de réaliser des analyses complexes de données. Elle a été développée en
2008.
À la fin de l’année 2009, elle a été mise en open source et elle est utilisée dans le
domaine de Big data et de data science car elle offre des performances et une
productivité élevée aux utilisateurs.
L’une des forces de Pandas est qu’il se base sur NumPy, bibliothèque très populaire.
En plus, les données produites par Pandas sont souvent utilisées comme données
en entrée pour les fonctions de plotting de Matplotlib, l’analyse statistique
en SciPy, les algorithmes de machine learning en Scikit-learn.
Il vaut mieux utiliser l’outil Jupyter Notebook pour écrire vos codes. Il est intégré
directement dans Anaconda.
Chargement
import pandas as pd
Structures de données
Pandas dispose de deux grandes structures de données, les séries et les
DataFrames
1
Représentation
import pandas as pd
s=[Link](range(3)) # Série d'entiers sans indexation
print(s)
2
a = [1, 7, 2]
s = [Link](a)
print(s)
0 1
1 7
2 2
dtype: int64
import numpy as np
myvar = [Link]([Link](3, 4))
print(myvar)
Création
import pandas as pd
a = [1, 7, 2]
myvar = [Link](a)
print(myvar)
0 1
1 7
2 2
dtype: int64
Syntaxe
class [Link](data=None, index=None, dtype=None, name=None
, copy=False, fastpath=False)
Étiquettes
Les étiquettes des axes représentent l’index de la série. Cette étiquette peut être
utilisée pour accéder à une valeur spécifiée.
Si rien n'est spécifié, les valeurs sont étiquetées avec leur numéro d'index. La
première valeur à l'indice 0, la deuxième valeur a l'indice 1, etc.
Une série est comme une colonne dans une feuille Excel.
data
data peut être un dictionnaire Python, un ndarray (tableau multi-dimensionnel de
NumPy) ou même une valeur scalaire.
3
index
L'index passé en argument est une liste d’étiquettes correspondant à chaque ligne
de la série. s = [Link]([18, 20, 15, 7], [10,11,12,13])
10 18
11 20
12 15
13 7
dtype: int64
dtype
Type de données pour les éléments de la Série. S'il n'est pas spécifié, il sera déduit des
données.
Exemple
import pandas as pd
print(ser)
data = [Link](['a','b','c','d'])
s1 = [Link](data)
print(s1)
s1 = [Link](data,index=[10,11,12,13])
Modification de valeurs
[Link]({'a': 'A', 'b': 'B'}) : remplace les 'a' par des 'A' et 'b' par des
'B' et renvoie une série modifiée.
#vérifie si l'étiquette "Sciences Physiques" est présente dans
l'index
a = "Sciences Physiques" in ser
print(a)
4
Pour donner des noms, on peut aussi utiliser un dictionnaire :
[Link]({'a': 1, 'b': 2, 'c': 5, 'd': 7}) ce qui revient au
même (si on donne un dictionnaire, les éléments sont triés par ordre
alphabétique des clefs).
print(ser)
s1[0]
# s1[9] erreur
5
s[0:3] : renvoie une série avec les valeurs des indices 2 à 4 exclus,
mais cette-fois, ce sont bien des indices de ligne !
s[[0, 2, 3]] : valeurs pour les indices donnés, avec les même
problèmes d'ambiguité que ci-dessus sur les indices, selon qu'ils sont
numériques ou non.
[Link][1] : utilisation des numéros de lignes (origine à 0) sans
ambiguité !
[Link][1:3] : avec un range sur les numéros de lignes (origine à 0)
sans ambiguité et renvoie une série.
[Link][[1, 3]] : utilisation des numéros de lignes (origine à 0) sans
ambiguité et renvoie une série.
print ([Link]) #affiche l'index de la série
print ([Link]) #affiche la data de la série
ind = [Link](['a','b','c','d','e','f','g','h','i','j'])
data = [Link]([12,52,41,16,43,85,74,74,95,23])
s1 = [Link](data, index=ind)
s1['a']
s1[2]
s1[['b', 'd']]
# 1° série
s1 = [Link]([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
# 2° série
s2 = [Link]([40, 30, 20, 10,200], index=['d', 'c', 'b', 'a','e'])
Sous Series
s = [Link]([Link](0, 15))
6
# Quelles sont les lignes avec une valeur supérieure à 10
print(s > 5)
On peut déterminer si toutes les valeurs d'une série correspondent à une expression donnée en
utilisant la méthode .all().
(s >= 3).all()
# Supérieur à zéro
(s >= 0).all()
Le résultat de ces expressions logiques est une sélection booléenne, une série de valeurs Vrai et
Faux.
Le .sum() d'une série, lorsqu'on lui donne une série de valeurs booléennes, traitera True comme
1 et False comme 0.
s = [Link]([Link](0, 15))
s1=s[s > 4]
print(s1[0]) ???
7
# On peut supprimer un item en utilisant la fonction del
del(s['z'])
Sélection d'éléments
s = [Link]([Link](50,60), index=[Link](10,20))
les index seulement présents dans l'une des deux series donnent NaN.
on peut éliminer les lignes ayant NaN par : (s1 + s2).dropna()
8
Attribut name d'une série :
on peut attribuer un nom à une série :
s = [Link]([2, 5, 7, 3], index = ['a', 'b', 'c', 'd'], name = 'val')
Comptage de valeurs :
on suppose qu'on a défini la Serie (colonne de dataframe) :
s = [Link]([1, 3, 5, 3, 5, 2, 8, 3, 1, 7, 4, 2, 3, 6, 3]).
Opérateur in
L'opérateur in pour une série ne teste pas l'appartenance à la série, mais à
son index !
s = [Link]([2, 5, 7, 3], index = ['a', 'b', 'c', 'd'])
Fonction isin
si s = [Link](['a', 'b', 'c'])
[Link]() : renvoie les index dans l'ordre croissant des valeurs (de telle sorte
que s[[Link]()] est trié par ordre croissant).
Attention : ce ne sont pas les numéros d'ordre pour chaque valeur, utiliser rank pour cela !
10
[Link] : convertit en minuscule (idem avec upper pour
majuscules).
[Link]('(\w)(\d)') : renvoie une série numérique indiquant le
nombre de match avec le pattern de chaque élément.
Divers :
s.to_frame() : convertit la série en DataFrame à une seule colonne
(dont le nom est le nom de la série).
s.to_frame(name = 'A') : on peut donner un nom à la colonne.
s.memory_usage() : donne la mémoire utilisée en nombre d'octets.
Si aucun index n’est passé, un index sera créé avec les valeurs [0, …, len(data) – 1].
Exemple
s = [Link]([Link]([67060000, 83020000, 328200000]), index=["France",
"Allemagne", "Etats-Unis"])
11
Dataframe
[Link]
La Dataframe est une structure de données qui organise les données en lignes et en
colonnes, ce qui en fait une structure de données bidimensionnelle.
C'est comme une feuille de calcul Excel ou une table SQL, ou encore un
dictionnaire d’objets Series.
Un Dataframe, comme une série, peut être construit à partir de nombreux types :
Un dict de ndarrays 1D, listes, dicts, ou Series ;
Un [Link] bidimensionnelle ;
Un ndarray strucuré ;
Une série ;
Ou encore un autre Dataframe.
Le nom des lignes d’un DataFrame est appelé “index” qui, par défaut, commence
toujours par 0.
Cependant, il est possible d’indexer les lignes d’un DataFrame par n’importe
quelle valeur possible.
12
Exemple
import numpy as np
myvar = [Link]([Link](3, 4))
print(myvar)
Exemple
data=[(1, [Link](1), 'un'), (2, [Link](2), 'deux'), (3, [Link](3),
'trois')]
myvar = [Link](data,index=list('abc'), columns='i val nom'.split())
Exemple
notes = {
"Mathématiques": [Link]([18.0, 20.0, 17.0], index=["Sylvie", "Gilles", "Sylvain"]),
"Sciences Physiques": [Link]([15.0, 7.0, 10.0,20.0], index=["Sylvie", "Gilles",
"Sylvain", "Thomas"]),
}
df = [Link](notes)
Remarque
on peut aussi faire un dataframe avec les 2 séries, puis prendre le minimum
par ligne : [Link]([s1, s2], axis = 1).min(axis = 1)
Exemple
notes ={"maths": [Link]([15.2, 10.5, 17.5], index=["e1","e2","e3"]),
"physiques": [Link]([14.0, 18.5, 9.5, 10.5], index=["e1", "e2", "e3", "e4"]) }
df = [Link](notes)
13
print(df)
print([Link])
print([Link])
Exemple :
data = {"Prenom": ["Sylvie", "Gilles", "Sylvain", "Thomas"],
"Age": [18.0, 23.0, 25.0, 40.0]}
df = [Link](data)
print(df)
14
Afficher les n dernières lignes du dataframe
[Link](n)
Le Slicing
Nous pouvons filtrer les données en utilisant le slice. Par
exemple, df[:n] renvoie les n premières lignes du DataFrame.
df = pd.read_csv("[Link]", comment='#')
print(df)
Il existe principalement deux méthodes d’accès aux données spécifiques à Pandas :
L’opérateur d’indexation [ ] ;
Les méthodes fournis par Pandas .loc() et .iloc() ;
15
print(df['M'].value_counts())
Pour éviter toute confusion, la bibliothèque Pandas fournit deux méthodes d’accès
aux données :
16
print([Link][1]) renvoie « rose ».
.loc() et .iloc() prennent également en charge les fonctionnalités que vous attendez
des opérateurs d’indexation, comme le découpage en tranches.
Toutefois, ces méthodes d’accès aux données présentent une différence importante.
Alors que .iloc() exclut l’élément de fermeture, .loc() l’inclut.
Sans indexation
M NGC Type Mag Size ... RA Dec Con Season Name
0 M1 1952 Sn 8.4 5.0 ... 5.575 22.017 Tau winter Crab Nebula
1 M2 7089 Gc 6.5 12.9 ... 21.558 0.817 Aqr autumn NaN
2 M3 5272 Gc 6.2 16.2 ... 13.703 28.383 CVn spring NaN
3 M4 6121 Gc 5.6 26.3 ... 16.393 -26.533 Sco summer NaN
4 M5 5904 Gc 5.6 17.4 ... 15.310 2.083 Ser summer NaN
Avec indexation
df1 = df.reset_index()
df1.set_index(['M'], inplace=True)
print(df1)
index NGC Type Mag Size ... RA Dec Con Season Name
M ...
M1 0 1952 Sn 8.4 5.0 ... 5.575 22.017 Tau winter Crab Nebula
M2 1 7089 Gc 6.5 12.9 ... 21.558 0.817 Aqr autumn NaN
M3 2 5272 Gc 6.2 16.2 ... 13.703 28.383 CVn spring NaN
M4 3 6121 Gc 5.6 26.3 ... 16.393 -26.533 Sco summer NaN
M5 4 5904 Gc 5.6 17.4 ... 15.310 2.083 Ser summer NaN
print([Link][0])
print([Link]['M1'])
print([Link][0]) #erreur
Afficher un élément
#accès à la valeur située en (i,j) : [Link][i][j]
17
print([Link][0][0]) #accès à la valeur située en (0,0)
print([Link][0,0])
print([Link][0:5,:])
Tri du dataFrame
18
Le tri peut être généralisé aux DataFrame, par exemple : trier le tableau de données selon une
colonne.
print(df.sort_values(by='RA')
Les requêtes
Les projections
19
Exemple
age sexe typedouleur sucre tauxmax angine depression coeur
0 70 masculin D A 109 non 24 presence
1 67 feminin C A 160 non 16 absence
2 57 masculin A A 141 non 3 presence
3 64 masculin D A 105 oui 2 absence
4 74 feminin B A 121 oui 2 absence
print(df['typedouleur']=="A")
Liste des individus présentant une douleur de type A et ayant une angine
#liste des individus présentant une douleur de type A et angine ==
oui
print([Link][(df['typedouleur']=="A") & (df['angine'] ==
"oui"),:])
On peut n'afficher qu'une partie des colonnes, on définit la projection dans une liste
colonnes = ['age','sexe','coeur','tauxmax']
print([Link][(df['age'] < 45) & (df['sexe'] == "masculin") & (df['coeur'] == "presence"),
colonnes])
20
masculin 83 100
Multiplier les critères est possible mais la lecture devient compliquée
print([Link]([df['sexe'],df['sucre']],df['coeur']))
[Link]()
Permet de sélectionner des lignes par valeur de colonne.
[Link]("(Mag < 5) & (Size > 60)") # Select * from df where (Mag < 5) & (Size
> 60)
Quelques méthodes
Sélection Syntaxe Résultat
Suppression de colonne
[Link]() permet d’éliminer une ou plusieurs colonnes
d’un dataframe:
Par défaut, beaucoup d’opérations retournent une copie de la structure, sauf si l’opération se fait
« sur place » (inplace=True).
D’autres opérations d’accès retournent seulement une nouvelle vue des mêmes données.
21
Exemple
df = [Link]([Link](12).reshape(3, 4), index=list('abc'), columns=
list('ABCD'));
print(df)
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
Filtrage
Noter qu’il existe une façon de filtrer les données sur les colonnes ou les
labels:
[Link](regex='M.7', axis='index').filter('RA Dec'.split())
Syntaxe
[Link](items=None, like=None, regex=None, axis=None)
Exemples
[Link](items=['one', 'three'] #select columns by name
22
L’objectif principal visé lorsqu’on utilise la bibliothèque pandas est d’effectuer une
analyse statistique sur un ensemble de données.
Dans cette section, nous allons explorer les agrégations dans Pandas, à partir
d’opérations simples.
Exemple
Considérons le DataFrame suivant représentant les notes obtenues par des élèves
dans quatre formations différentes.
df_notes = [Link]({
"Introduction au Big data": [Link]([11.0, 15.0, 10.0,10.0],index=["Sylvie",
"Gilles", "Sylvain", "Thomas"]),
"Hadoop": [Link]([18.0, 20.0, 17.0,18.0], index=["Sylvie", "Gilles", "Sylvain",
"Thomas"]),
"Spark": [Link]([15.0, 7.0, 10.0,20.0],index=["Sylvie", "Gilles", "Sylvain",
"Thomas"]),
"Java": [Link]([18.0, 20.0, 10.0,8.0],index=["Sylvie", "Gilles", "Sylvain",
"Thomas"]),
})
Print(df_notes)
La méthode .sum()
Elle renvoie la somme des valeurs sur l’axe demandé (renvoie la somme des notes
obtenues pour chaque étudiant),
Exemple :
La méthode .mean()
Elle renvoie la moyenne des valeurs de l’axe demandé (renvoie la moyenne obtenue
de chaque étudiant) :
df_notes.mean(axis=1)
La méthode .max()
23
Elle renvoie le maximum des valeurs de l’axe demandé (renvoie la note maximale
obtenue dans chaque formation).
df_notes.max(axis=0)
La seule complexité réside dans le fait que vous pouvez joindre des colonnes en plus
des lignes.
L’opération de filtrage
Les Dataframe Pandas permettent l’indexation booléenne, qui est un moyen assez
efficace de filtrer un dataframe pour plusieurs conditions.
Considérons le DataFrame suivant représentant les notes obtenues par des élèves
dans quatre formations différentes.
df_notes = [Link]({
"Introduction au Big data": [Link]([11.0, 15.0, 10.0,10.0],index=["Sylvie",
"Gilles", "Sylvain", "Thomas"]),
"Hadoop": [Link]([18.0, 20.0, 17.0,18.0], index=["Sylvie", "Gilles", "Sylvain",
"Thomas"]),
"Spark": [Link]([15.0, 7.0, 10.0,20.0],index=["Sylvie", "Gilles", "Sylvain",
"Thomas"]),
"Java": [Link]([18.0, 20.0, 10.0,8.0],index=["Sylvie", "Gilles", "Sylvain",
"Thomas"]),
})
print(df_notes)
ex1 :
Extraire du les étudiants ayant obtenu une note supérieure ou égale à 15 en Java.
req1 = df_notes[(df_notes['Java']>=15)]
print(req1)
Ex 2 : En plus de connaitre les étudiants ayant une note supérieure ou égal à 15 en Java, nous
voulons, en plus connaître les étudiants ayant une note supérieure ou égale à 10 en Spark.
resultat = df_notes[(df_notes['Java']>=15)&(df_notes['Spark']>=10)]
print(resultat[["Spark", "Java"]])
L’opération de groupage
24
La fonction groupby() est l’une des fonctions les plus utiles lorsqu’il s’agit de traiter
des dataframes volumineux dans Pandas.
print(df)
L’opération de concaténation
Vous pouvez concaténer des dataframes le long de l’axe des lignes ou des colonnes.
Supposons que vous ayez plusieurs dataframes comportant les mêmes champs et
que vous souhaitiez les combiner en un seul le long de l’axe des lignes. Ou encore,
si vous avez des champs supplémentaires pour vos données actuelles que vous
souhaitez ajouter, alors vous pouvez les concaténer le long de l’axe des colonnes.
Dans cette partie, nous allons voir comment concaténer deux ou plusieurs
dataframes avec Pandas.
Concaténation verticale
Considérons cet exemple :
25
# Affichage des dataframes
print("DataFrame df1:\n")
print(df1)
print("\nDataFrame df2:\n")
print(df2)
# Affichage du résultat
print("\nRésultat de la concaténation:\n", df_concat)
Concaténation horizontale
Illustrons cela par les instructions qui suivent :
# Affichage du résultat
print("\nRésultat de la concaténation:\n", df_concat).
26
Lire les fichiers avec pandas
Une caractéristique de Pandas est sa capacité à écrire et à lire des fichiers Excel,
CSV et de nombreux autres types de fichiers.
Vous pouvez les utiliser pour charger des données de vos fichiers dans les instances
Pandas Series ou DataFrame. Dans cette section nous verrons :
Les dataframes de Pandas sont assez puissants pour traiter des données tabulaires
bidimensionnelles.
Pour lire un fichier csv avec Pandas on utilise la fonction read_csv(). Elle est fournie
avec un certain nombre de paramètres différents pour personnaliser la façon dont
vous souhaitez lire le fichier.
import pandas as pd
df = pd.read_csv(path_to_file)
Elle renvoie un dataframe pandas.
Dans l’exemple suivant, nous chargerons un fichier csv stockant les données sur les espèces et le
poids des animaux capturés sur le site du désert de Chihuahuan près de Portal, Arizona, États-
Unis.
Chaque ligne contient les informations relatives à un seul animal, et les colonnes représentent les
caractéristiques étudiées.
import pandas as pd
df =
pd.read_csv("[Link]
print(df)
Sur le dataframe obtenu nous pouvons avoir des statistiques avec la méthode .describe()
comme ceci :
print([Link]());
27
et travaillé avec des feuilles de calcul Excel. Cette popularité d’Excel est due à sa vaste
gamme d’applications dans le domaine du stockage et de la manipulation de données sous
forme de tableaux et de systèmes. De plus, les feuilles Excel sont très instinctives et
conviviales, ce qui les rend idéales pour la manipulation de grands ensembles de données,
même pour les personnes moins techniques.
Dans cette sous-section, vous allez apprendre à utiliser Pandas pour travailler avec des feuilles
de calcul Excel. L’objectif de cette sous-section est de vous apprendre à :
Lire les données d’un fichier Excel dans pandas en utilisant Python.
Explorer les données des fichiers Excel dans Pandas.
import pandas as pd
data = pd.read_excel("fichier_sauvegarde.xlsx")
data
La deuxième instruction lit les données d’Excel et les stocke dans un dataframe
pandas représenté par la variable data.
S’il y a plusieurs feuilles dans le classeur Excel, la commande importera les données
de la première feuille.
import pandas as pd
d_Etudiants = pd.read_excel("[Link]",
sheet_name="Etudiants")
d_Etudiants
28
Visualisation des données
Pour que nous puissions analyser correctement nos données, nous devons les
représenter de manière tangible et complète afin que toutes les personnes
concernées puissent les comprendre.
La bibliothèque Pandas offre un large éventail d’outils. Dans cette section, nous
allons couvrir pas à pas tout ce dont on a besoin pour commencer à utiliser les outils
de visualisation de Pandas, notamment les diagrammes à barres,
les histogrammes et les pie chart.
29