1
votes

Supprimer le mot dans une chaîne en fonction d'une autre valeur de colonne

J'ai deux colonnes qui sont une combinaison de mots séparés par des virgules et de mots simples dans un format de chaîne. col1 ne contiendra toujours qu'un seul mot. Dans cet exemple, j'utiliserai le mot Chien comme mot à avoir dans col1 , mais cela différera dans les données réelles, donc veuillez ne pas faire une solution qui utilise regex sur Dog spécifiquement.

    col1    col2
0   Dog     Cat, Mouse
1   Dog 
2   Dog     Cat
3   Dog     Mouse

Je veux vérifier si le mot de col1 apparaît dans la chaîne de col2 code >, et si c'est le cas, je souhaite supprimer ce mot de col2 . Mais gardez à l'esprit que je veux conserver le reste de la chaîne s'il reste plus de mots. Donc ça ira de ceci:

    col1    col2    
0   Dog     Cat, Mouse
1   Dog     Dog
2   Dog     Cat
3   Dog     Dog, Mouse

À ceci:

df = pd.DataFrame({"col1": ["Dog", "Dog", "Dog", "Dog"],
                     "col2": ["Cat, Mouse", "Dog", "Cat", "Dog, Mouse"]})


2 commentaires

À mon humble avis, il suffit de parcourir les données de manière itérative, puis d'utiliser string.replace c'est-à-dire x.replace ('Dog', '')


Avez-vous lu la question? Cette solution n'est pas reproductible


3 Réponses :


2
votes

Essayez ceci:

   col1     col2
0   Dog     Cat, Mouse
1   Dog 
2   Dog     Cat
3   Dog     Mouse
4   Dog     Cat, Mouse

un autre df, avec un chien au milieu:

df = pd.DataFrame({"col1": ["Dog", "Dog", "Dog", "Dog","Dog"],
                     "col2": ["Cat, Mouse", "Dog", "Cat", "Dog, Mouse", "Cat, Dog, Mouse"]})

df


   col1     col2
0   Dog     Cat, Mouse
1   Dog     Dog
2   Dog     Cat
3   Dog     Dog, Mouse
4   Dog     Cat, Dog, Mouse

Appliquez le code ci-dessus:

import re
df['col2'] = [(re.sub(fr"({word}[\s,]*)","",sentence)) 
             for word,sentence in zip(df.col1,df.col2)]
df

    col1    col2
0   Dog     Cat, Mouse
1   Dog 
2   Dog     Cat
3   Dog     Mouse


0 commentaires

1
votes

(^, |, $) pour gérer les virgules de début et de fin
(, \ s |,) supprimera les virgules celles qui seront conservées après l'opération de remplacement.
{1,} pour ignorer les virgules non répétées

df['col2'] = df['col2'].str. \
    replace("|".join(df['col1'].unique()), "").str.strip() \
    .str.replace("(?:^,|,$)", "") \
    .str.replace("(?:,\s|,){1,}", ",")

  col1          col2
0  Dog     Cat,Mouse
1  Dog              
2  Dog           Cat
3  Dog   Mouse,Mouse


3 commentaires

Que faire si Chien apparaît au milieu de la chaîne ou à la fin de la chaîne? Cela me laissera avec quelques virgules en excès. Désolé, je ne l'ai pas spécifié dans la question


@torkestativ, est-ce que col1 aura une valeur unique ou plusieurs valeurs?


il aura une valeur unique, @Sushanth



1
votes

l = df.col1.tolist () #list of col1

Créer un ensemble à partir de col2 , évaluer l'appartenance de l dans défini en trouvant la différence en appliquant la fonction lambda.

df['col2']=list(zip(df.col2))
df['col2']=df.col2.apply(lambda x:[*{*x}-{*l}]).str[0]

entrez la description de l'image ici


0 commentaires