2025.42 changes
This commit is contained in:
@@ -581,13 +581,13 @@ import pandas as pd
|
||||
|
||||
data = pd.Series(data=["matt", "jenn", "igor", "alex", "mila"])
|
||||
# Ici on garde True si la valeur contient un "i" minuscule
|
||||
filter_data1 = data.loc[data.str.contains("i")]
|
||||
filter_data1 = data.loc[data.str.contains("i", regex=True)]
|
||||
# Ici on garde True si la valeur contient un "i" (ignore la casse)
|
||||
filter_data2_a = data.loc[data.str.contains("(?i)i")]
|
||||
filter_data2_b = data.loc[data.str.contains("i", case=False)]
|
||||
filter_data2_a = data.loc[data.str.contains("(?i)i", regex=True)]
|
||||
filter_data2_b = data.loc[data.str.contains("i", case=False, regex=True)]
|
||||
# Si vous connaissez les regex, le reste marche aussi :
|
||||
# Ici reconnaître les chaînes où un caractère apparaît 2 fois de suite
|
||||
filter_data3 = data.loc[data.str.contains(r"(\w)\1")]
|
||||
filter_data3 = data.loc[data.str.contains(r"(\w)\1", regex=True)]
|
||||
```
|
||||
|
||||
[Apprendre les Regex avec RegexLearn](https://regexlearn.com/fr)
|
||||
@@ -739,6 +739,8 @@ data["hour"] = data.dt.round("H")
|
||||
print(data)
|
||||
```
|
||||
|
||||
[Fréquences disponibles pour l'arrondi](https://pandas.pydata.org/docs/user_guide/timeseries.html#timeseries-offset-aliases)
|
||||
|
||||
----
|
||||
|
||||
### Dédupliquer des lignes
|
||||
@@ -1182,7 +1184,7 @@ df = pd.DataFrame(data={
|
||||
})
|
||||
|
||||
# Appliquer une fonction sur chaque colonne
|
||||
df2 = df.apply(double, axis="columns")
|
||||
df2 = df.apply(double, axis="index")
|
||||
```
|
||||
|
||||
----
|
||||
@@ -1365,6 +1367,25 @@ ses colonnes, mais uniquement à partir des deux lignes précédentes, ex. :
|
||||
|
||||
----
|
||||
|
||||
### Fonctions de partition : Comptage de lignes par groupe
|
||||
|
||||
Vous pouvez dans un DataFrame utiliser la méthode `.groupby()`{.python} pour scinder
|
||||
son contenu en groupes possédant une valeur en commun.
|
||||
En SQL, le résultat d'un `GROUP BY` doit généralement être suivi d'un calcul d'agrégation,
|
||||
qui va calculer une valeur d'agrégation (somme, moyenne) pour chaque groupe.
|
||||
Dans Pandas, la contrainte est généralement la même; on appliquera des méthodes
|
||||
d'agrégation une fois les groupes créés.
|
||||
|
||||
Pandas offre également des fonctions de [fenêtrage]{.naming} sur le résultat :
|
||||
Plutôt que d'obtenir un résultat seul pour chaque groupe, le partitionnement permet de conserver
|
||||
les lignes de chaque groupe. Une des fonctions de partitionnement proposées est
|
||||
`.cumcount()`{.python} : la méthode applique à chaque ligne une numérotation, qui
|
||||
démarre à zéro pour chaque groupe distinct.
|
||||
|
||||
TODO: Groupby + cumcount (potentiellement un sort_values avant)
|
||||
|
||||
----
|
||||
|
||||
### Fonctions d'agrégation mobiles/glissantes
|
||||
|
||||
Si nous appliquons cette idée sur la colonne `minutes`, nous obtiendrons une colonne avec les valeurs suivantes :
|
||||
@@ -1379,6 +1400,10 @@ runs = pd.DataFrame(data={
|
||||
"minutes": [31, 47, 26, 52, 34, 22, 36, 15, 30],
|
||||
})
|
||||
# Calculer la nouvelle colonne
|
||||
# Somme glissante utilisant 2 observations (premier argument)
|
||||
# Pour faire une somme, il faut au minimum 0 observation, sinon le résultat est NaN (min_periods=0)
|
||||
# L'argument `center=False`{.python} indique que la fenêtre est décalée vers le passé
|
||||
# L'argument `closed="both"`{.python} indique que les deux bornes sont incluses dans le calcul
|
||||
runs["3-day sum"] = runs["minutes"].rolling(2, min_periods=0, center=False, closed="both").sum()
|
||||
```
|
||||
|
||||
@@ -1398,11 +1423,30 @@ runs = pd.DataFrame(data={
|
||||
"minutes": [31, 47, 26, 52, 34, 22, 36, 15, 30],
|
||||
})
|
||||
# Calculer la nouvelle colonne
|
||||
runs["total sum"] = runs["minutes"].expanding(min_periods=0).sum()
|
||||
# La même chose peut être faite avec une somme roulante avec un grand nombre d'observations
|
||||
runs["total sum+"] = runs["minutes"].rolling(len(runs), min_periods=0).sum()
|
||||
runs["expanding mean"] = runs["minutes"].expanding(min_periods=0).mean()
|
||||
# La même chose peut être faite avec une moyenne roulante (lissée) avec un grand nombre d'observations
|
||||
runs["expanding mean+"] = runs["minutes"].rolling(len(runs), min_periods=0).mean()
|
||||
```
|
||||
|
||||
Les méthodes `runs.rolling`{.python} et `runs.expanding`{.python} peuvent être précédées d'un
|
||||
`.groupby()`{.python} et d'un `.sort_values()`{.python} pour créer des groupes d'agrégation
|
||||
et organiser les éléments dans chaque groupe.
|
||||
|
||||
----
|
||||
|
||||
## Astuces inoubliables
|
||||
|
||||
À l'usage, de nombreux cas empiriques déborderont des bases vues dans ce chapitre. Par exemple, certains
|
||||
comportements sont difficiles à comprendre, ou certains usages nécessitent quelques ajustements pour la performance.
|
||||
|
||||
- **Warnings** concernant la modification sur une copie
|
||||
- `pandas.DataFrame.apply()` très lent
|
||||
|
||||
----
|
||||
|
||||
### Warning : modifications sur une copie de slice
|
||||
|
||||
Lorsqu'un utilisateur utilise Pandas dans le cadre d'une recherche ou d'un traitement, il est fréquent de
|
||||
vouloir filtrer les lignes d'un `DataFrame`, puis d'appliquer des modifications au contenu de ce dernier.
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user