2025.46 changes
This commit is contained in:
@@ -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}.
|
||||
|
||||
Reference in New Issue
Block a user