import pandas as pd
import numpy as npconditions 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
childrenPassengerId
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: boolchildren.dtypedtype('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()
-> 68ou 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: int64ainsi 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: int64valeurs 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ù
Truesignifie que la valeur est manquanteFalseque 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: booll’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()
-> 177on 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: booldf['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 :
Truesignifie que la valeur est manquanteFalseque 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’axis0 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: int64nous 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: int64le passager d’id 261 a deux valeurs manquantes
# le code
df.isna().sum() # c'est la
df.isna().sum(axis=0) # même choseSurvived 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: int64les 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’axis0 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()
-> 866il 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 codeutilisez 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 listecolsdes noms des colonnes choisies
(1) servez-vous du help pd.Series.unique?
# votre codeutilisez l’expression
df[cols]pour sélectionner la sous-dataframe réduite à ces 4 colonnes
et utilisez l’attributdtypesdespandas.DataFramepour afficher le type de ces 4 colonnes
# votre codeque constatez-vous ?
quel type serait plus approprié pour ces colonnes ?
# votre codeexercice conditions¶
lisez la data-frame des passagers du titanic
# votre codecomptez les valeurs manquantes: dans toute la table, par colonne et par ligne
# votre codecalculez le nombre de classes du bateau
# votre codecalculez le taux d’hommes et de femmes
indice: voyez les paramètres optionnels deSeries.value_counts()
# votre codecalculez le taux de personnes entre 20 et 40 ans (bornes comprises)
# votre codecalculez le taux de survie des passagers
# votre codecalculez le taux de survie des hommes et des femmes par classes
i.e. pour chacun des 6 groupes (hommes/femmes) x (classe 1/2/3)
(notez qu’on reverra ces décomptes d’une autre manière)
# votre code