@@ -562,22 +562,43 @@ df.count()
562
562
```
563
563
564
564
``` {python}
565
- df.mean()
565
+ df.mean(numeric_only = True )
566
566
```
567
567
568
568
569
569
``` {python}
570
- df.sum()
570
+ df.sum(numeric_only = True )
571
571
```
572
572
573
573
``` {python}
574
574
df.nunique()
575
575
```
576
576
577
577
``` {python}
578
- df.quantile(q = [0.1,0.25,0.5,0.75,0.9])
578
+ df.quantile(q = [0.1,0.25,0.5,0.75,0.9], numeric_only = True )
579
579
```
580
580
581
+ ::: {.cell .markdown}
582
+ ``` {=html}
583
+ <div class="alert alert-danger" role="alert">
584
+ <i class="fa-solid fa-triangle-exclamation"></i> Warning</h3>
585
+ ```
586
+
587
+ La version 2.0 de ` Pandas ` a introduit un changement
588
+ de comportement dans les méthodes d'agrégation.
589
+
590
+ Il est dorénavant nécessaire de préciser quand on désire
591
+ effectuer des opérations si on désire ou non le faire
592
+ exclusivement sur les colonnes numériques. C'est pour cette
593
+ raison qu'on exlicite ici l'argument ` numeric_only = True ` .
594
+ Ce comportement
595
+ était par le passé implicite.
596
+
597
+ ``` {=html}
598
+ </div>
599
+ ```
600
+ :::
601
+
581
602
582
603
Il faut toujours regarder les options de ces fonctions en termes de valeurs manquantes, car
583
604
ces options sont déterminantes dans le résultat obtenu.
@@ -964,7 +985,7 @@ La syntaxe est quasiment transparente. On peut bien-sûr effectuer des opératio
964
985
par groupe sur plusieurs colonnes. Par exemple,
965
986
966
987
``` {python}
967
- df.groupby('dep').mean()
988
+ df.groupby('dep').mean(numeric_only = True )
968
989
```
969
990
970
991
A noter que la variable de groupe, ici ` dep ` , devient, par défaut, l'index
@@ -987,9 +1008,13 @@ Il est possible d'appliquer plus d'une opération à la fois grâce à la métho
987
1008
de chaque département, on peut faire:
988
1009
989
1010
``` {python}
990
- df.groupby('dep').agg(['min',"median","max"])
1011
+ numeric_columns = df.select_dtypes(['number']).columns
1012
+ df.loc[:, numeric_columns.tolist() + ["dep"] ].groupby('dep').agg(['min',"median","max"], numeric_only = True)
991
1013
```
992
1014
1015
+ La première ligne est présente pour nous faciliter la récupération des noms de colonnes des variables
1016
+ numériques
1017
+
993
1018
## Appliquer des fonctions
994
1019
995
1020
` pandas ` est, comme on a pu le voir, un package très flexible, qui
@@ -1013,7 +1038,13 @@ en milliers de tonnes. Dans ce cas, le premier réflexe est d'utiliser
1013
1038
la ` lambda ` function suivante:
1014
1039
1015
1040
``` {python}
1016
- df.groupby('dep').agg(['min',"median","max"]).apply(lambda s: s/1000)
1041
+ numeric_columns = df.select_dtypes(['number']).columns
1042
+ (df
1043
+ .loc[:, numeric_columns.tolist() + ["dep"] ]
1044
+ .groupby('dep')
1045
+ .agg(['min',"median","max"])
1046
+ .apply(lambda s: s/1000)
1047
+ )
1017
1048
```
1018
1049
1019
1050
En effet, cela effectue le résultat désiré. Cependant, il y a mieux: utiliser
@@ -1022,8 +1053,9 @@ la méthode `div`:
1022
1053
``` {python}
1023
1054
#| eval: false
1024
1055
import timeit
1025
- %timeit df.groupby('dep').agg(['min',"median","max"]).div(1000)
1026
- %timeit df.groupby('dep').agg(['min',"median","max"]).apply(lambda s: s/1000)
1056
+ df_numeric = df.loc[:, numeric_columns.tolist() + ["dep"] ]
1057
+ %timeit df_numeric.groupby('dep').agg(['min',"median","max"]).div(1000)
1058
+ %timeit df_numeric.groupby('dep').agg(['min',"median","max"]).apply(lambda s: s/1000)
1027
1059
```
1028
1060
1029
1061
La méthode ` div ` est en moyenne plus rapide et a un temps d'exécution
@@ -1034,7 +1066,7 @@ des performances équivalentes:
1034
1066
1035
1067
``` {python}
1036
1068
#| eval: false
1037
- %timeit df .groupby('dep').agg(['min',"median","max"])/1000
1069
+ %timeit df_numeric .groupby('dep').agg(['min',"median","max"])/1000
1038
1070
```
1039
1071
1040
1072
` apply ` est plus rapide qu'une boucle (en interne, ` apply ` utilise ` Cython `
0 commit comments