Pandas — удаляет значения col1 из значений column2, если существует совпадение (совпадение регулярных выражений с динамическим значением)

#regex #pandas

#регулярное выражение #pandas

Вопрос:

У меня есть задача обновить значения в column_1, ЕСЛИ они полностью совпадают со значением из column_2. Вот так

 name              city
Danny London      London
Tim Detroit       Detroit
Keith New Orleans The city of New Orleans
Mary Jane         London
  

=>

 name              city
Danny             London                   <- updated
Tim               Detroit                  <- updated
Keith New Orleans The city of New Orleans  
Mary Jane         London                    
  

До сих пор я пробовал это

 condlidt = [df.apply(lambda x: x.name_cleaned.endwith(f"{x.city}"), axis=1)]
choicelist = [df.name_cleaned.str.replace(rf'{df.city}$', '', regex=True]
fd['name_cleaned'] = np.select(condlist, choicelist, default=df.name_cleaned)
  

Но он возвращает тот же df. Я проверил и condlist работает как ожидалось — возвращает True / False для значений, проблема в choicelist — не уверен, как передать регулярное выражение с динамическим значением. Был бы очень признателен за любую помощь.

Ответ №1:

Вместо проверки endswith вы можете добавить значение $ для конца строки, а также s для совпадающих пробелов и преобразовать эти значения в пустую строку в re.sub :

 import re

df['name'] = df.apply(lambda x: re.sub(rf"s {x.city}$",'',x['name']), axis=1)
print (df)
                name                     city
0              Danny                   London
1                Tim                  Detroit
2  Keith New Orleans  The city of New Orleans
3          Mary Jane                   London