Renommer les catégories d'une colonne dans un dataframe

Résolu/Fermé
FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022 - Modifié le 17 mars 2022 à 12:41
mamiemando Messages postés 33161 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 juin 2024 - 18 mars 2022 à 17:11
Bonsoir tout le monde,

J'ai un
DataFrame
de cette sorte :

import io
import pandas as pd

csv = io.StringIO("""action,adresse_ip,ip_source,ip_destination,client
block,128.30.03.29,29E9t9994,12300rtgR30,client1
block,13.19.04.22,29E9th9994,12300Rg30,client1
allow,40.77.05.293,29dfbfE99994,12d300R30,client2
block,128.90.73.294,29E99fv994,1230s0R30,client2
allow,128.30.83.295,29Egfn99994,12h300R30,client3
allow,90.03.93.296,29E99fv994,123k00R30,client5
allow,128.30.04.297,29E99994,12300tR30,client7
block,128.40.01.298,29E99994,1230z0R30,client8
block,128.50.02.299,29E99994,1230v0R30,client9""")

df = pd.read_csv(csv)


Ce sont toutes des données catégorielles, et j'aimerais corriger les adresses IP (colonne 2) commençant par
128.30
(donc ici, les lignes 1, 5, 7 des données CSV) en
128.30.0.0
.

J'ai des millions de données et je ne peux pas faire une par une. J'ai essayé cette approche mais ça ne marche pas :
df["adresse_ip"] = [
    "128.30.0.0" if (df[df["source_ip"].astype(str).str.startswith('128.30')]) else
    x
    for x in df["adresse_ip"]
] 


Merci d'avance de votre aide.
A voir également:

2 réponses

mamiemando Messages postés 33161 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 juin 2024 7 760
Modifié le 17 mars 2022 à 13:03
Bonjour,

Merci de fournir des exemples minimaux et directement réutilisables, en suivant https://forums.commentcamarche.net/forum/affich-37548300-extraire-des-lignes-d-un-dataframe#3 ce genre de modèle afin qu'on ne galère pas à charger de notre côté tes données d'exemple.

Merci également de formater ton message et de soigner l'orthographe :
  • le "code" non python (résultat de programme, nom de fichiers...) devrait être dans des balises de code
  • le code python devrait être dans une balise de code python (clique sur le triangle à droite du permettant de mettre les balises de code).


J'ai reformaté ton message en conséquence, j'espère ne pas avoir commis d'erreur (notamment tes noms de colonnes semblaient incorrects).

Bref, en repartant de ton message corrigé, ton code devrait être corrigé ainsi :

df["adresse_ip"] = [
    "128.30.0.0" if x.startswith('128.30') else
    x
    for x in df["adresse_ip"]
]
print(df)


... ce qui donne :

  action     adresse_ip     ip_source ip_destination   client
0 block 128.30.0.0 29E9t9994 12300rtgR30 client1
1 block 13.19.04.22 29E9th9994 12300Rg30 client1
2 allow 40.77.05.293 29dfbfE99994 12d300R30 client2
3 block 128.90.73.294 29E99fv994 1230s0R30 client2
4 allow 128.30.0.0 29Egfn99994 12h300R30 client3
5 allow 90.03.93.296 29E99fv994 123k00R30 client5
6 allow 128.30.0.0 29E99994 12300tR30 client7
7 block 128.40.01.298 29E99994 1230z0R30 client8
8 block 128.50.02.299 29E99994 1230v0R30 client9


... mais à mon avis ce serait mieux d'utiliser
pandas.DataFrame.apply
 ou
pandas.DataFrame.replace
.

df["adresse_ip"] = df["adresse_ip"].apply(
    lambda ip: "128.30.0.0" if ip.startswith('128.30') else ip
)


df["adresse_ip"] = df["adresse_ip"].replace(
    regex=r"^128[.]30[.].*",
    value="128.30.0.0"
)


Bonne chance
1
FerhatYous Messages postés 20 Date d'inscription jeudi 24 février 2022 Statut Membre Dernière intervention 8 août 2022
Modifié le 18 mars 2022 à 15:51
Merci les deux marchent bien pour moi
0
mamiemando Messages postés 33161 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 juin 2024 7 760
18 mars 2022 à 17:11
Parfait, je bascule le sujet en résolu. N'hésite pas à le faire par toi-même à l'avenir.

Bonne continuation !
0