2025.46 changes

This commit is contained in:
2025-11-15 18:20:01 +01:00
parent c45c6e9f2d
commit cb516edca4
8 changed files with 132 additions and 32 deletions

View File

@@ -438,10 +438,11 @@ print(selection1, selection2, sep="\n")
### Bon à savoir : vues et copies
Lorsque vous extrayez une partie d'un `DataFrame`{.python}, vous obtenez généralement un objet de type `DataFrame`{.python}.
Cependant, il faut savoir que par défaut, le nouveau `DataFrame`{.python} est une **vue** sur le `DataFrame`{.python} initial.
Cela veut dire que si vous modifiez le contenu du `DataFrame`{.python} initial, le contenu du `DataFrame`{.python} extrait sera aussi modifié, et vice versa.
Cependant, il faut savoir que dans Pandas 2.0+, le nouveau `DataFrame`{.python} est une **copie** des données du `DataFrame`{.python} initial.
Cela veut dire que modifier le contenu d'un des deux `DataFrame`{.python} n'a pas d'effet sur l'autre.
Pour obtenir une copie des données du `DataFrame`{.python} extrait, il faut utiliser la méthode `.copy()`{.python}.
Pour obtenir une vue des données du `DataFrame`{.python} extrait et appliquer des modifications partagées, il faut
extraire en utilisant par exemple `.loc[(lignes, colonnes)]` (avec un `tuple`{.python}).
```python {.numberLines}
import pandas as pd
@@ -552,8 +553,13 @@ is_high = data > 3 # F, F, F, T, T, T
high_data = data.loc[is_high & is_even] # 4, 6
```
On peut utiliser les opérateurs binaires `&`{.python} (`and`) et `|`{.python} (`or`) pour combiner les séries de booléens.
Le résultat est une série de booléens de la même longueur.
Pour des questions d'ordre d'évaluation des opérateurs, vous devrez quasi systématiquement utiliser des parenthèses pour discriminer vos conditions.
Les opérateurs à utiliser pour assembler vos propositions sont les opérateurs logiques binaires:
- `&`{.python}: ET binaire
- `|`{.python}: OU binaire
- `~`{.python}: NON binaire
- `^`{.python}: OU exclusif binaire
----
@@ -712,6 +718,24 @@ L'attribut est documenté ici :
[37]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.day_name.html
[38]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.isocalendar.html
----
#### Exemple d'extraction de la semaine ISO
Dans le standard ISO, le numéro de semaine est déterminé comme suit :
La première semaine de l'année est celle dont la majorité de jours (au moins 4) est contenue
dans l'année en cours.
```python {.numberLines}
import pandas as pd
data = pd.DataFrame(data={
"order": ["A15", "B84", "D25", "B43"],
"date": pd.to_datetime(["2024-06-10", "2021-02-14", "2023-06-25", "2024-11-30"])
})
data["week"] = data["date"].dt.isocalendar()["week"]
```
----
@@ -870,6 +894,14 @@ Dans tous les cas sauf pour `df.at`{.python}, la clé peut être un des objets s
- liste de clés de lignes/colonne ou numéro de ligne (`[a, b, c]`{.python});
- tuple à deux éléments (`(ligne(s), colonne(s))`{.python}).
**Attention** : Passer un tuple contenant un slice ne fonctionne pas syntaxiquement parlant
s'il est exprimé explicitement, ie. avec des parenthèses.
```python {.numberLines}
df.loc[(0, 0:2)] # Ceci est une erreur de syntaxe
df.loc[0, 0:2] # Ceci est du Python valide
```
----
## Valeurs vides
@@ -1020,6 +1052,9 @@ df3 = df.fillna({"siret": "N/A", "siege": "Inconnu"})
df4 = df.ffill() # forward fill
# Remplir les colonnes avec la prochaine valeur non vide trouvée
df5 = df.bfill() # backward fill
# Remplir les valeurs NaN en interpolant
# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.interpolate.html
df6 = df.interpolate(method="cubic")
```
----
@@ -1157,6 +1192,8 @@ df = pd.DataFrame(data={
df.drop(labels=["prenom"], axis="columns", inplace=True)
# Retirer les lignes aux index 0 et 2, mais retourner un nouveau DataFrame
df2 = df.drop(labels=[0, 2], axis="index")
# Variante : Retirer les lignes aux index 0 et 2
df3 = df.drop(index=[0, 2])
```
----
@@ -1200,7 +1237,7 @@ df = pd.DataFrame(data={
"numero": [8, 31, 23, 14]
})
# Appliquer une fonction sur chaque colonne
# Appliquer une fonction sur chaque ligne
df2 = df.apply(lambda s: s * 2, axis="columns")
```
@@ -1434,7 +1471,7 @@ et organiser les éléments dans chaque groupe.
----
## Astuces inoubliables
## Extra :En vrac
À 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.
@@ -1446,7 +1483,14 @@ comportements sont difficiles à comprendre, ou certains usages nécessitent que
### 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.
Lorsqu'un utilisateur utilise Pandas dans l'objectif de modifier un `DataFrame`{.python}
extrait d'un `DataFrame`{.python} plus large (après filtrage de lignes par exemple), il
sera généralement exposé à un message d'avertissement tel que le suivant :
```text {.numberLines}
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
```
Le message peut être désactivé via les paramètres de Pandas, ou encore en récupérant explicitement
un `DataFrame`{.python} via la méthode `copy()`{.python}.