import pandas as pd
import numpy as np
conditions sur une dataframe¶
conditions et masques¶
structure d’un masque¶
# le code
df = pd.read_csv('data/titanic.csv', index_col='PassengerId')
children = df['Age'] < 12
children
PassengerId
552 False
638 False
499 False
261 False
395 False
...
463 False
287 False
326 False
396 False
832 True
Name: Age, Length: 891, dtype: bool
children.dtype
dtype('bool')
girls = (df['Age'] < 12) & (df['Sex'] == 'female')
girls.sum()
np.int64(32)
indexation par un masque¶
comment utiliser un masque ?
en pratique, le plus souvent on est intéressés par les lignes qui correspondent au masque
et pour les “extraire” de la dataframe on va tout simplement
indexer la dataframe par le masque
c’est-à-dire en français: écrire df[mask]
# pour construire la dataframe réduite aux filles
girls_df = df[girls]
girls_df.head(2)
->
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
PassengerId
238 1 2 Collyer, Miss. Marjorie "Lottie" female 8.0 0 2 C.A. 31921 26.250 NaN S
375 0 3 Palsson, Miss. Stina Viola female 3.0 3 1 349909 21.075 NaN S
en fait on fera même plutôt df.loc[mask]
, mais bon, on n’a pas encore parlé de .loc
...
# le code
girls_df = df[girls]
girls_df.head(2)
# avec .loc (même si on ne l'a pas encore vu...)
girls_df = df.loc[girls]
girls_df.head(2)
value_counts()
¶
comment calculer le nombre d’enfants ?
par exemple nous pouvons sommer les True
avec pandas.Series.sum
children = df['Age'] < 12
children.sum()
-> 68
ou utiliser la méthode value_counts()
qui compte les occurrences dans une colonne
children = df['Age'] < 12
children.value_counts()
-> False 823
True 68
Name: count, dtype: int64
ainsi parmi les passagers dont on connait l’âge, 68
passagers, ont moins de 12
ans
on reviendra tout de suite sur les données manquantes
children.sum()
np.int64(68)
children.value_counts()
Age
False 823
True 68
Name: count, dtype: int64
valeurs manquantes¶
contexte général¶
souvent, certaines colonnes ont des valeurs manquantes...
dans l’exemple du Titanic, ce sont les valeurs qui ne sont pas renseignées dans le csv
on a souvent besoin de les trouver, les compter, et si nécessaire les éliminer
NA
signifie Non-Available et NaN
Not-a-Number
sur les DataFrame
et les Series
, la méthode isna()
construit un masque
du même type (DataFrame ou Series donc), et à valeurs booléennes où
True
signifie que la valeur est manquanteFalse
que la valeur ne l’est pas
il existe son contraire qui est notna()
il existe aussi des synonymes isnull()
et notnull()
- préférez isna
valeurs manquantes dans une colonne¶
regardons les valeurs manquantes d’une colonne
df['Age'].isna()
-> PassengerId
552 False
638 False
499 False
261 True
395 False
...
396 False
832 False
Name: Age, Length: 891, dtype: bool
l’age du passager d’Id
261 est manquant
on peut le vérifier dans le fichier en format csv
:
261,0,3,"Smith, Mr. Thomas",male,,0,0,384461,7.75,,Q
^^
combien d’ages sont manquants ?
df['Age'].isna().sum()
-> 177
on y reviendra
# le code
df['Age'].isna()
PassengerId
552 False
638 False
499 False
261 True
395 False
...
463 False
287 False
326 False
396 False
832 False
Name: Age, Length: 891, dtype: bool
df['Age'].isna().sum()
np.int64(177)
# remarquez qu'on peut tout aussi bien
# utiliser le sum() de np ou de Python
import numpy as np
np.sum(df['Age'].isna()), sum(df['Age'].isna())
(np.int64(177), 177)
valeurs manquantes sur une dataframe¶
la méthode isna()
s’applique aussi à une dataframe
et elle retourne une dataframe de booléens où - sans surprise :
True
signifie que la valeur est manquanteFalse
que la valeur ne l’est pas
regardons les valeurs manquantes d’une dataframe
df.isna()
-> Survived Pclass Name Sex ... Ticket Fare Cabin Embarked
PassengerId ...
552 False False False False ... False False True False
638 False False False False ... False False True False
499 False False False False ... False False False False
261 False False False False ... False False True False
395 False False False False ... False False False False
... ... ... ... ... ... ... ... ... ...
463 False False False False ... False False False False
287 False False False False ... False False True False
326 False False False False ... False False False False
396 False False False False ... False False True False
832 False False False False ... False False True False
[891 rows x 11 columns]
vous remarquez une dataframe de la même taille que df
# le code
df.isna()
compter les valeurs manquantes¶
comme en numpy
je peux appliquer une fonction - ici sum()
- en précisant l’axis
0
on applique la fonction dans l’axe des lignes (le défaut): on obtient un résultat par colonne1
on applique la fonction dans l’axe des colonnes
l’objet retourné est une série contenant le résultat de la fonction
exemple avec la somme (sum
) des valeurs manquantes sur l’axe des lignes axis=0
qui sum
les lignes entre elles - le résultat est par colonne donc
df.isna().sum() # les deux formes sont
df.isna().sum(axis=0) # équivalentes
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
nous remarquons des valeurs manquantes dans les colonnes Cabin
, Age
et Embarked
pour souligner une différence avec numpy
: comparez le comportement
- de
array.sum()
- et
df.sum()
(on y revient ci-dessous)
dans l’autre direction (axis=1)¶
exemple de la somme des valeurs manquantes sur l’axe des colonnes
df.isna().sum(axis=1):
-> PassengerId
552 1
638 1
499 0
261 2
395 0
..
463 0
287 1
326 0
396 1
832 1
Length: 891, dtype: int64
le passager d’id 261
a deux valeurs manquantes
# le code
df.isna().sum() # c'est la
df.isna().sum(axis=0) # même chose
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
# le code
df.isna().sum(axis=1)
PassengerId
552 1
638 1
499 0
261 2
395 0
..
463 0
287 1
326 0
396 1
832 1
Length: 891, dtype: int64
les fonctions numpy
d’agrégation¶
les méthodes numpy
d’agrégation (comme sum()
et mean()
et min()
etc...) s’appliquent sur des pandas.DataFrame
et des pandas.Series
on précise l’axis
0
pour l’axe des lignes (c’est le mode par défaut)1
pour l’axe des colonnes
différence avec numpy
, si on appelle sans préciser axis
- avec numpy: on obtient le résultat global
- avec pandas: par défaut
axis=0
, on agrège sur l’axe des lignes
si on désire le résultat global
- soit on applique la fonction deux fois
e.g.df.isna().sum().sum()
- soit on peut passer par le sous-tableau
numpy
et là la fonctionnumpy.sum()
donnera le résultat global
la méthode pandas.DataFrame.to_numpy
retourne le tableau numpy.ndarray
de la DataFrame pandas
df.isna().to_numpy()
-> array([[False, False, False, ..., False, True, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, True, False],
[False, False, False, ..., False, True, False]])
on somme
np.sum(df.isna().to_numpy())
df.isna().to_numpy().sum()
-> 866
il y a 866
valeurs manquantes dans toute la data-frame
remarque: contrairement à ce qu’on avait vu en numpy
, ici on ne pourrait pas faire df.isna().sum(axis=(0, 1))
il faut faire en deux fois df.isna().sum().sum()
df.isna().sum().sum()
np.int64(866)
# le code
df.isna().to_numpy()
array([[False, False, False, ..., False, True, False],
[False, False, False, ..., False, True, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, True, False],
[False, False, False, ..., False, True, False]], shape=(891, 11))
# le code
np.sum(df.isna().to_numpy())
df.isna().to_numpy().sum()
np.int64(866)
exercice valeurs uniques¶
- lisez la data-frame du titanic
df
# votre code
- utilisez la méthode
pd.Series.unique
(1) pour compter le nombre de valeurs uniques
des colonnes'Survived'
,'Pclass'
,'Sex'
et'Embarked'
vous pouvez utiliser un for-python pour parcourir la listecols
des noms des colonnes choisies
(1) servez-vous du help pd.Series.unique?
# votre code
- utilisez l’expression
df[cols]
pour sélectionner la sous-dataframe réduite à ces 4 colonnes
et utilisez l’attributdtypes
despandas.DataFrame
pour afficher le type de ces 4 colonnes
# votre code
- que constatez-vous ?
quel type serait plus approprié pour ces colonnes ?
# votre code
exercice conditions¶
- lisez la data-frame des passagers du titanic
# votre code
- comptez les valeurs manquantes: dans toute la table, par colonne et par ligne
# votre code
- calculez le nombre de classes du bateau
# votre code
- calculez le taux d’hommes et de femmes
indice: voyez les paramètres optionnels deSeries.value_counts()
# votre code
- calculez le taux de personnes entre 20 et 40 ans (bornes comprises)
# votre code
- calculez le taux de survie des passagers
# votre code
- calculez le taux de survie des hommes et des femmes par classes
(notez qu’on reverra ces décomptes d’une autre manière)
# votre code