LIBRAIRIE PANDAS
Introduction
Pandas est la librairie la plus utilisée en Data Science avec Python. A travers ce cours,
vous apprendrez les fondamentaux de Pandas pour l'importation et l'analyse des
données.
Imaginons que nous souhaitions représenter des animaux. Disons... des pandas par
exemple ! Nous pouvons caractériser un panda par sa taille ; ou plutôt, par ses tailles :
disons par exemple, la longueur du corps, la hauteur de la hanche, la hauteur de
l'épaule, et le périmètre thoracique. On peut représenter ce pandas par une liste :
In [2]: un_panda = [100, 40, 42, 61]
un_panda
Out[2]: [100, 40, 42, 61]
Ici, notre panda a une longueur du corps de 180 cm, une hauteur de la hanche de 77cm,
une hauteur de l'épaule de 81 cm et un périmètre thoracique de 106 cm de diamètre. Si
on veut représenter plusieurs pandas, on crée une liste de listes :
In [3]: # Famille panda
famille_panda = [
[149, 64, 67, 86], #maman
[51, 21, 25, 45], #bébé
[180, 77, 81, 106] #papa
]
famille_panda
Out[3]: [[149, 64, 67, 86], [51, 21, 25, 45], [180, 77, 81, 106]]
Par exemple, supposons qu'on veuille obtenir la longueur du corps (situé en position 0
dans chaque liste qui décrit un panda) du panda situé en position 2 dans ma liste (c'est-
à-dire papa panda).
In [5]: #longueur du corps de papa panda
famille_panda[2][0]
Out[5]: 180
In [6]: #Pour connaître la longueur du corps de toute la famille panda
for i in range(3):
print(famille_panda[i][0])
149
51
180
C'est assez pratique certes, mais ce n'est pas très explicite. On aimerait pouvoir
spécifier les noms des variables caractéristiques d'un panda. Cela nous amène à la
librairie pandas.
In [7]: #importation de la librairie
import pandas
# Création d'une dataframe à partir d'un tableau
famille_panda_df = [Link](famille_panda)
famille_panda_df
Out[7]:
0 1 2 3
0 149 64 67 86
1 51 21 25 45
2 180 77 81 106
On peut faire mieux :
In [8]: famille_panda_df = [Link](famille_panda,
columns = ['corps', 'hanche', 'épaules',
index = ['maman', 'bébé', 'papa'])
famille_panda_df
Out[8]:
corps hanche épaules thorax
maman 149 64 67 86
bébé 51 21 25 45
papa 180 77 81 106
Le nom des lignes est appelé index. Un index peut être une chaîne de caractères ou un
nombre entier. Quand aucun index n'est spécifié à la création du dataframe, il est
initialisé par défaut avec une suite continue d'entiers commençant par 0.
L'objet DataFrame est très similaire à certains concepts que l'on trouve en dehors du
cadre du langage 𝑃 𝑦𝑡ℎ𝑜𝑛 . Il est similaire :
aux tables des bases de données relationnelles que l'on manipule grâce à 𝑆𝑄𝐿
à l'objet dataframe sur lequel se base tout le langage 𝑅 , langage destiné aux
statisticiens et aux Data Analysts
aux tableaux 𝐸𝑥𝑐𝑒𝑙
Voici quelques petites fonctionnalités des Dataframes.
Tout d'abord, accédons à la colonne thorax de notre table :
In [9]: famille_panda_df['thorax']
Out[9]: maman 86
bébé 45
papa 106
Name: thorax, dtype: int64
Accédons maintenant au 𝑝𝑎𝑝𝑎 panda : d'abord par sa position (position 2), puis par son
nom " 𝑝𝑎𝑝𝑎 " . Le résultat retourné est exactement le même dans les 2 cas.
In [10]: # indexation positionnelle
famille_panda_df.iloc[2]
Out[10]: corps 180
hanche 77
épaules 81
thorax 106
Name: papa, dtype: int64
In [11]: # indexation par label
famille_panda_df.loc['papa']
Out[11]: corps 180
hanche 77
épaules 81
thorax 106
Name: papa, dtype: int64
Déterminons les pandas dont le diamètre du thorax est supérieur à 100 (Filtration de
données) :
In [12]: filtre = famille_panda_df['thorax'] > 100
famille_panda_df[filtre]
Out[12]:
corps hanche épaules thorax
papa 180 77 81 106
Pour inverser le masque, il suffit d'utiliser l'opérateur ~, et nous sélectionnons les pandas
qui n'ont pas un thorax supérieur à 100 :
In [13]: famille_panda_df[~filtre]
Out[13]:
corps hanche épaules thorax
maman 149 64 67 86
bébé 51 21 25 45
Lecture d'un fichier CSV (Comma Separated Values)
avec PANDAS
In [1]: import pandas
#Importation des données sous format CSV
data_activity = pandas.read_csv('[Link]')
In [2]: # La première chose à faire est de jeter un rapide coup d'oeil à notre
data_activity.info()
<class '[Link]'>
RangeIndex: 169 entries, 0 to 168
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Duration 169 non-null int64
1 Pulse 169 non-null int64
2 Maxpulse 169 non-null int64
3 Calories 164 non-null float64
dtypes: float64(1), int64(3)
memory usage: 5.4 KB
Le résultat ci-dessus nous renseigne sur les noms des colonnes, le nombre de valeurs
non manquantes par colonne (implicitement le nombre de valeurs manquantes par
colonne), le type des valeurs dans chaque colonne, la mémoire utilisée par ces données,
le nombre de lignes et de colonnes, etc.
In [3]: #Affichage des premières lignes
#5 par défaut
data_activity.head()
Out[3]:
Duration Pulse Maxpulse Calories
0 60 110 130 409.1
1 60 117 145 479.0
2 60 103 135 340.0
3 45 109 175 282.4
4 45 117 148 406.0
In [4]: data_activity.head(3)
Out[4]:
Duration Pulse Maxpulse Calories
0 60 110 130 409.1
1 60 117 145 479.0
2 60 103 135 340.0
In [5]: #De même pour les dernières lignes
data_activity.tail()
Out[5]:
Duration Pulse Maxpulse Calories
164 60 105 140 290.8
165 60 110 145 300.0
166 60 115 145 310.2
167 75 120 150 320.4
168 75 125 150 330.4
In [7]: data_activity.tail(10)
Out[7]:
Duration Pulse Maxpulse Calories
159 30 80 120 240.9
160 30 85 120 250.4
161 45 90 130 260.4
162 45 95 130 270.0
163 45 100 140 280.9
164 60 105 140 290.8
165 60 110 145 300.0
166 60 115 145 310.2
167 75 120 150 320.4
168 75 125 150 330.4
On peut aussi regarder un mélange de lignes d'un tableau de données :
In [8]: # Échantillon aléatoire de la dataframe
data_activity.sample(7)
Out[8]:
Duration Pulse Maxpulse Calories
93 15 80 100 50.5
119 60 103 124 332.7
0 60 110 130 409.1
158 60 114 150 382.8
65 180 90 130 800.4
50 60 107 136 380.2
13 60 104 132 379.3
In [9]: #sélection d'une colonne
data_activity['Pulse']
Out[9]: 0 110
1 117
2 103
3 109
4 117
...
164 105
165 110
166 115
167 120
168 125
Name: Pulse, Length: 169, dtype: int64
In [10]: #sélection avec une condition
condition1 = data_activity['Pulse'] > 150
data_activity[condition1]
Out[10]:
Duration Pulse Maxpulse Calories
58 20 153 172 226.4
80 30 159 182 319.2
85 30 151 170 300.0
95 20 151 168 229.4
97 25 152 168 244.2
In [13]: condition2 = (data_activity['Pulse'] > 130) & (data_activity['Duration'
data_activity[condition2]
Out[13]:
Duration Pulse Maxpulse Calories
54 30 136 175 238.0
58 20 153 172 226.4
80 30 159 182 319.2
81 45 149 169 344.0
85 30 151 170 300.0
94 20 150 171 127.4
95 20 151 168 229.4
97 25 152 168 244.2
135 20 136 156 189.0
139 20 141 162 222.4
153 30 150 167 275.8
In [14]: #On peut également obtenir un classement par ordre croissant des valeur
data_activity.sort_values('Maxpulse')
#ordre décroissant
#data_activity.sort_values('Maxpulse', ascending=False)
Out[14]:
Duration Pulse Maxpulse Calories
103 90 90 100 500.4
93 15 80 100 50.5
102 90 90 100 500.0
22 60 130 101 300.0
88 45 129 103 242.0
... ... ... ... ...
58 20 153 172 226.4
54 30 136 175 238.0
3 45 109 175 282.4
80 30 159 182 319.2
109 210 137 184 1860.4
169 rows × 4 columns
Indicateurs statistiques
Pour chaque colonne :
count() renvoie le nombre de valeurs
median() renvoie la liste des médianes
mean() renvoie la liste des moyennes
std() renvoie la liste des écarts-types
min(), max(), sum(), ...
Mentionnons aussi l'excellente fonction describe() . Elle donne des statistiques diverses
(moyenne, minimum, maximum, etc.) sur les données contenues dans chaque colonne.
In [15]: data_activity.describe()
Out[15]:
Duration Pulse Maxpulse Calories
count 169.000000 169.000000 169.000000 164.000000
mean 63.846154 107.461538 134.047337 375.790244
std 42.299949 14.510259 16.450434 266.379919
min 15.000000 80.000000 100.000000 50.300000
25% 45.000000 100.000000 124.000000 250.925000
50% 60.000000 105.000000 131.000000 318.600000
75% 60.000000 111.000000 141.000000 387.600000
max 300.000000 159.000000 184.000000 1860.400000
On obtient dans l’ordre le nombre de lignes, la moyenne, l’écart-type, la valeur minimale,
le premier, deuxième et troisième quartiles et la valeur maximale par colonne.
In [16]: #Il est possible de ne visualiser qu’une colonne. Par exemple, pour n’a
data_activity['Pulse'].describe()
Out[16]: count 169.000000
mean 107.461538
std 14.510259
min 80.000000
25% 100.000000
50% 105.000000
75% 111.000000
max 159.000000
Name: Pulse, dtype: float64
Représentation graphique
In [1]: import pandas
import [Link] as mpl
#importation des données
data_countries=pandas.read_csv('data_countries.csv')
#Un extrait de la table
data_countries.sample(7)
Out[1]:
Country Continent Year LifeExp Population GDPPerCap
1551 Tunisia Africa 2007.0 73.923 10276158.0 7092.923025
397 Denmark Europe 1997.0 76.110 5283663.0 29804.345670
1446 Sweden Europe 1962.0 73.370 7561588.0 12329.441920
819 Korea, Dem. Rep. Asia 2007.0 67.297 23301725.0 1593.065480
536 Gambia Africa 1972.0 38.308 517101.0 756.086836
114 Belgium Europe 1982.0 73.930 9856303.0 20979.845890
645 Hong Kong, China Asia 1977.0 73.600 4583700.0 11186.141250
In [2]: #affichage des lignes concernant le maroc
country1='Morocco'
df1=data_countries[data_countries['Country']==country1]
df1
Out[2]:
Country Continent Year LifeExp Population GDPPerCap
988 Morocco Africa 1952.0 42.873 9939217.0 1688.203570
989 Morocco Africa 1957.0 45.423 11406350.0 1642.002314
990 Morocco Africa 1962.0 47.924 13056604.0 1566.353493
991 Morocco Africa 1967.0 50.335 14770296.0 1711.044770
992 Morocco Africa 1972.0 52.862 16660670.0 1930.194975
993 Morocco Africa 1977.0 55.730 18396941.0 2370.619976
994 Morocco Africa 1982.0 59.650 20198730.0 2702.620356
995 Morocco Africa 1987.0 62.677 22987397.0 2755.046991
996 Morocco Africa 1992.0 65.393 25798239.0 2948.047252
997 Morocco Africa 1997.0 67.660 28529501.0 2982.101858
998 Morocco Africa 2002.0 69.615 31167783.0 3258.495584
999 Morocco Africa 2007.0 71.164 33757175.0 3820.175230
In [3]: #Exprimer graphiquement le PIB en fonction des années
[Link](df1['Year'], df1['GDPPerCap'], 'go--')
[Link]('Year')
[Link]('GDPPerCap')
Out[3]: Text(0, 0.5, 'GDPPerCap')
In [4]: #Affichage des payés concernés
data_countries['Country'].unique()
Out[4]: array(['Afghanistan', 'Albania', 'Algeria', 'Angola', 'Argentina',
'Australia', 'Austria', 'Bahrain', 'Bangladesh', 'Belgium',
'Benin', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', '
Brazil',
'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambodia', 'Cameroo
n',
'Canada', 'Central African Republic', 'Chad', 'Chile', 'Chi
na',
'Colombia', 'Comoros', 'Congo', 'Costa Rica', 'Croatia', 'C
uba',
'Czech Republic', 'Denmark', 'Djibouti', 'Dominican Republi
c',
'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Er
itrea',
'Ethiopia', 'Finland', 'France', 'Gabon', 'Gambia', 'German
y',
'Ghana', 'Greece', 'Guatemala', 'Guinea', 'Guinea-Bissau',
'Haiti',
'Honduras', 'Hong Kong, China', 'Hungary', 'Iceland', 'Indi
a',
'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Italy', 'Ivory Coa
st',
'Jamaica', 'Japan', 'Jordan', 'Kenya', 'Korea, Dem. Rep.',
'Korea, Rep.', 'Kuwait', 'Lebanon', 'Liberia', 'Libya',
'Madagascar', 'Malawi', 'Malaysia', 'Mali', 'Mauritania',
'Mauritius', 'Mexico', 'Mongolia', 'Montenegro', 'Morocco',
'Mozambique', 'Myanmar', 'Namibia', 'Nepal', 'Netherlands',
'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Norway', '
Oman',
'Pakistan', 'Palestine', 'Panama', 'Paraguay', 'Peru',
'Philippines', 'Poland', 'Portugal', 'Puerto Rico', 'Reunio
n',
'Romania', 'Rwanda', 'Sao Tome and Principe', 'Saudi Arabi
a',
'Senegal', 'Serbia', 'Sierra Leone', 'Singapore',
'Slovak Republic', 'Slovenia', 'Somalia', 'South Africa', '
Spain',
'Sri Lanka', 'Sudan', 'Swaziland', 'Sweden', 'Switzerland',
'Syria', 'Taiwan', 'Tanzania', 'Thailand', 'Togo',
'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Uganda',
'United Kingdom', 'United States', 'Uruguay', 'Venezuela',
'Vietnam', 'Yemen, Rep.', 'Zambia', 'Zimbabwe'], dtype=obje
ct)
In [5]: country2='Palestine'
df2=data_countries[data_countries['Country']==country2]
#Tracer plusieurs courbes en même temps
[Link](df1['Year'], df1['GDPPerCap'], 'ro--', label=country1)
[Link](df2['Year'], df2['GDPPerCap'], 'go--', label=country2)
[Link]('Year')
[Link]('GDPPerCap')
[Link]() #pour distinguer les courbes
Out[5]: <[Link] at 0x12af0fcd0>
In [6]: #affichage des statistiques de l'année 2007
df_2007 = data_countries[data_countries['Year']==2007]
df_2007
Out[6]:
Country Continent Year LifeExp Population GDPPerCap
11 Afghanistan Asia 2007.0 43.828 31889923.0 974.580338
23 Albania Europe 2007.0 76.423 3600523.0 5937.029526
35 Algeria Africa 2007.0 72.301 33333216.0 6223.367465
47 Angola Africa 2007.0 42.731 12420476.0 4797.231267
59 Argentina Americas 2007.0 75.320 40301927.0 12779.379640
... ... ... ... ... ... ...
1623 Venezuela Americas 2007.0 73.747 26084662.0 11415.805690
1635 Vietnam Asia 2007.0 74.249 85262356.0 2441.576404
1647 Yemen, Rep. Asia 2007.0 62.698 22211743.0 2280.769906
1659 Zambia Africa 2007.0 42.384 11746035.0 1271.211593
1671 Zimbabwe Africa 2007.0 43.487 12311143.0 469.709298
139 rows × 6 columns
In [7]: #Expression des statistiques en ce qui concerne le PIB en 2007 sous for
[Link](df_2007['GDPPerCap'], edgecolor='black', bins=6) #bins pour sp
[Link]()
[Link]('GDPPerCap')
#Calcul de la moyenne et de l'écart-type
print("La moyenne en 2007 était ", df_2007['GDPPerCap'].mean(), "et l''
#Calcul de la médiane
print("La médiane en 2007 était ", df_2007['GDPPerCap'].median())
La moyenne en 2007 était 11711.115338724461 et l''écart-type 128
98.583933569626
La médiane en 2007 était 6223.367465
In [8]: #représentation en utilisant les quartiles avec la boîte à moustaches
df_2007.boxplot(column=['GDPPerCap'], grid=True)
Out[8]: <Axes: >
In [9]: #représentation par continent
df_2007.boxplot(by='Continent', column=['GDPPerCap'], grid=True);