Как заменить слово в фрейме данных, используя другой фрейм данных в Pandas Python - PullRequest
6 голосов
/ 09 мая 2019

У меня есть два фрейма данных:

df * * 1004

id   string_data
1    My name is Jeff
2    Hello, I am John
3    I like Brad he is cool.

Другой фрейм данных с именем allnames содержит список имен, подобных этому:

id  name
1   Jeff
2   Brad
3   John
4   Emily
5   Ross

Я хочу заменить все слова в df, которые появляются в allnames['name'], на "Firstname"

Ожидаемый результат:

id   string_data
1    My name is Firstname
2    Hello, I am Firstname
3    I like Firstname he is cool.

Я пробовал это:

nameList = '|'.join(allnames['name'])
df['string_data'].str.replace(nameList, "FirstName", case = False))

Но он заменяет почти 99% слов

1 Ответ

6 голосов
/ 09 мая 2019

Ваше решение должно работать, если добавить границы слов к Series.str.replace:

nameList = '|'.join(r"\b{}\b".format(x) for x in allnames['name'])
df['string_data'] = df['string_data'].str.replace(nameList, "FirstName", case = False)
print (df)
   id                   string_data
0   1          My name is FirstName
1   2         Hello, I am FirstName
2   3  I like FirstName he is cool.

Или заменить значения на get и join по словарю:

d = dict.fromkeys(allnames['name'], 'Firstname')
f = lambda x: ' '.join(d.get(y, y) for y in x.split())
df['string_data'] = df['string_data'].apply(f)
print (df)
   id                   string_data
0   1          My name is Firstname
1   2         Hello, I am Firstname
2   3  I like Firstname he is cool.

РЕДАКТИРОВАТЬ: Вы можете преобразовать все значения в нижний регистр на lower:

d = dict.fromkeys([x.lower() for x in allnames['name']], 'Firstname')
f = lambda x: ' '.join(d.get(y.lower(), y) for y in x.split())
df['string_data'] = df['string_data'].apply(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...