2017-10-14 2 views
1

J'essaie d'itérer une liste de chaînes en utilisant dataframe1 pour vérifier si l'autre dataframe2 a des chaînes trouvées dans dataframe1 pour les remplacer.pandas: Remplacer la chaîne ne remplace pas la sous-chaîne ciblée

for index, row in nlp_df.iterrows(): 
    print(row['x1']) 
    string1 = row['x1'].replace("(","\(") 
    string1 = string1.replace(")","\)") 
    string1 = string1.replace("[","\[") 
    string1 = string1.replace("]","\]") 
    nlp2_df['title'] = nlp2_df['title'].replace(string1,"") 

Pour ce faire, j'itérées en utilisant le code ci-dessus pour vérifier et remplacer par une chaîne trouvée dans DF1

La sortie montre belows les chaînes dans DF1

wait_timeout 
interactive_timeout 
pool_recycle 
.... 
__all__ 
folder_name 
re.compile('he(lo') 

La sortie ci-dessous montre la sortie après le remplacement des chaînes dans df2

0 have you tried watching the traffic between th... 
1 /dev/cu.xxxxx is the "callout" device, it's wh... 
2    You'll want the struct package.\r\r\n 

Pour la sortie i n df2 chaînes comme /dev/cu.xxxxx aurait dû être remplacé au cours de l'itération, mais comme indiqué, il n'est pas supprimé. Cependant, j'ai essayé d'utiliser nlp2_df['title'] = nlp2_df['title'].replace("/dev/cu.xxxxx","") et réussi à l'enlever avec succès est-il une raison pour laquelle écrire directement la chaîne fonctionne mais en boucle en utilisant une variable à utiliser pour le remplacement ne le fait pas?

Merci d'avance!

Répondre

0

IIUC vous pouvez simplement utiliser des expressions régulières:

nlp2_df['title'] = nlp2_df['title'].str.replace(r'([\(\)\[\]])',r'\\\1') 

PS vous n'avez pas besoin du tout ... for loop

Démo:

In [15]: df 
Out[15]: 
      title 
0 aaa (bbb) ccc 
1 A [word] ... 

In [16]: df['new'] = df['title'].str.replace(r'([\(\)\[\]])',r'\\\1') 

In [17]: df 
Out[17]: 
      title    new 
0 aaa (bbb) ccc aaa \(bbb\) ccc 
1 A [word] ... A \[word\] ...