Skip to content

Commit 867325e

Browse files
Add numeric_only argument (#359)
* numeric_only * Automated changes * Automated changes --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 62aeec1 commit 867325e

File tree

1 file changed

+41
-9
lines changed
  • content/course/manipulation/02a_pandas_tutorial

1 file changed

+41
-9
lines changed

content/course/manipulation/02a_pandas_tutorial/index.qmd

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -562,22 +562,43 @@ df.count()
562562
```
563563

564564
```{python}
565-
df.mean()
565+
df.mean(numeric_only = True)
566566
```
567567

568568

569569
```{python}
570-
df.sum()
570+
df.sum(numeric_only = True)
571571
```
572572

573573
```{python}
574574
df.nunique()
575575
```
576576

577577
```{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)
579579
```
580580

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+
581602

582603
Il faut toujours regarder les options de ces fonctions en termes de valeurs manquantes, car
583604
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
964985
par groupe sur plusieurs colonnes. Par exemple,
965986

966987
```{python}
967-
df.groupby('dep').mean()
988+
df.groupby('dep').mean(numeric_only = True)
968989
```
969990

970991
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
9871008
de chaque département, on peut faire:
9881009

9891010
```{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)
9911013
```
9921014

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+
9931018
## Appliquer des fonctions
9941019

9951020
`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
10131038
la `lambda` function suivante:
10141039

10151040
```{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+
)
10171048
```
10181049

10191050
En effet, cela effectue le résultat désiré. Cependant, il y a mieux: utiliser
@@ -1022,8 +1053,9 @@ la méthode `div`:
10221053
```{python}
10231054
#| eval: false
10241055
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)
10271059
```
10281060

10291061
La méthode `div` est en moyenne plus rapide et a un temps d'exécution
@@ -1034,7 +1066,7 @@ des performances équivalentes:
10341066

10351067
```{python}
10361068
#| eval: false
1037-
%timeit df.groupby('dep').agg(['min',"median","max"])/1000
1069+
%timeit df_numeric.groupby('dep').agg(['min',"median","max"])/1000
10381070
```
10391071

10401072
`apply` est plus rapide qu'une boucle (en interne, `apply` utilise `Cython`

0 commit comments

Comments
 (0)