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"]})
3 Réponses :
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
(^, |, $)
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
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
À mon humble avis, il suffit de parcourir les données de manière itérative, puis d'utiliser
string.replace
c'est-à-direx.replace ('Dog', '')
Avez-vous lu la question? Cette solution n'est pas reproductible