Renommer les catégories d'une colonne dans un dataframe
Résolu
Bonsoir tout le monde,
J'ai un
Ce sont toutes des données catégorielles, et j'aimerais corriger les adresses IP (colonne 2) commençant par
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 :
Merci d'avance de votre aide.
J'ai un
DataFramede 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:
- Renommer colonne dataframe
- Déplacer colonne excel - Guide
- Renommer des fichiers en masse - Guide
- Trier colonne excel - Guide
- Colonne word - Guide
- Formule somme excel colonne - Guide
2 réponses
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 :
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 :
... ce qui donne :
... mais à mon avis ce serait mieux d'utiliser
Bonne chance
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.applyou
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
Merci les deux marchent bien pour moi
Parfait, je bascule le sujet en résolu. N'hésite pas à le faire par toi-même à l'avenir.
Bonne continuation !
Bonne continuation !