Как заменить несколько подстрок в серии Pandas, используя словарь? - PullRequest
0 голосов
/ 02 марта 2019

У меня есть серия струн Pandas.Я хочу сделать несколько замен для нескольких подстрок в строке , см .:

testdf = pd.Series([
    'Mary went to school today',
    'John went to hospital today'
])
to_sub = {
    'Mary': 'Alice',
    'school': 'hospital',
    'today': 'yesterday',
    'tal': 'zzz',
}
testdf = testdf.replace(to_sub, regex=True)  # does not work (only replaces one instance per row)
print(testdf)

В вышеприведенном случае желаемый вывод:

Alice went to hospital yesterday.
John went to hospizzz yesterday.

где примечаниев первой строке было три подстановки из словаря.

Как я могу выполнить это эффективно, кроме выполнения этой строки за строкой (в цикле for)?

Я пробовал df.replace(...), как и многие другиеответы на другие вопросы, но это заменяет только одну подстроку, результат выглядит так: Alice went to school today, где school и today не были заменены ..

Еще одна вещь, которую следует отметить, что замены должныслучаются одновременно для любого отдельного ряда.(см. hospital в первом ряду не заменяется секунда время на hospizzz, что будет неправильно ).

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Это работает для меня в версии Panadas 23.0 ...

С учетом DataFrame:

>>> testdf
0      Mary went to school today
1    John went to hospital today
dtype: object

Значения, которые необходимо заменить.

>>> replace_values = {'Mary': 'Alice', 'school': 'hospital', 'today': 'yesterday'}

РезультатРезультат:

>>> testdf.replace(replace_values, regex=True)
0    Alice went to hospital yesterday
1     John went to hospital yesterday
dtype: object

Другой пример с желаемым результатом:

Включая частичную строку ('tal': 'zzz') с заменой ..

>>> replace_values = {'Mary': 'Alice', 'school': 'hospital', 'today': 'yesterday', 'tal': 'zzz'}
>>> testdf.replace(replace_values, regex=True)
0    Alice went to hospizzz yesterday
1     John went to hospizzz yesterday
dtype: object
0 голосов
/ 02 марта 2019

Вы можете использовать:

#Borrowed from an external website
def multipleReplace(text, wordDict):
    for key in wordDict:
        text = text.replace(key, wordDict[key])
    return text

print(testdf.apply(lambda x: multipleReplace(x,to_sub)))

0    Alice went to hospital yesterday
1     John went to hospital yesterday

РЕДАКТИРОВАТЬ

Используя словарь, как указано ниже комментарии:

to_sub = {
'Mary': 'Alice',
'school': 'hospital',
'today': 'yesterday',
'tal': 'zzz'
}

testdf.apply(lambda x: ' '.join([to_sub.get(i, i) for i in x.split()]))

Выходы:

0    Alice went to hospital yesterday
1     John went to hospital yesterday
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...