replace pandas по спискам
Нужно в pandas сделать списочную замену слов. Есть код:
import pandas as pd
df = pd.read_excel('replace_origin.xlsx', engine='openpyxl')
df_lib = pd.read_excel('replace_lib.xlsx', engine='openpyxl')
df_1 = '|'.join(df_lib['old'])
df_2 = '|'.join(df_lib['new'])
print(df_1)
print(df_2)
df['test'] = df['test'].str.replace(df_1, df_2,regex=True)
df.to_excel('replace_test.xlsx')
но проблема в том, что на замену передается весть столбец из переменной df_2, пример:
df = pd.DataFrame({'test': ['Иванов Иван Иванович', 'Петров С.А.', 'Алексеев Евгений', 'Сидоров Георгий Иванович']})
df_lib = pd.DataFrame({'old': ['Иванов', 'Петров', 'Сидоров'],'new': ['Ivanov', 'Petrov', 'Sidorov']})
На выходе мы получаем следующее:
Ivanov|Petrov|Sidorov Иван Ivanov|Petrov|Sidorovич
Ivanov|Petrov|Sidorov С.А.
Алексеев Евгений
Что я делаю не так? Однозначно, что-то нужно мудрить с df_2, но что конкретно?
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Если вам нужно заменить подстроку, то можете сделать так:
import pandas as pd
df = pd.DataFrame({'test': ['Иванов Иван Иванович', 'Петров С.А.', 'Алексеев Евгений', 'Сидоров Георгий Иванович']})
df_lib = pd.DataFrame({'old': ['Иванов', 'Петров', 'Сидоров'],'new': ['Ivanov', 'Petrov', 'Sidorov']})
repl_doct = dict(zip(df_lib["old"], df_lib["new"]))
df = df.replace({"test":repl_doct}, regex=True)
Только обратите внимание на отчества. df:
test
0 Ivanov Иван Ivanovич
1 Petrov С.А.
2 Алексеев Евгений
3 Sidorov Георгий Ivanovич
чтобы избежать конфуза с отчествами, можно выделить фамилии с пробелом на конце для замены, то есть, в словаре замены сделать просто:
repl_doct = dict(zip(df_lib["old"]+ " ", df_lib["new"]+" "))
тогда получите годный датафрейм:
test
0 Ivanov Иван Иванович
1 Petrov С.А.
2 Алексеев Евгений
3 Sidorov Георгий Иванович