Перейти к TLDR; в нижней части этого ответа для краткого резюме
различия.
Разницу легко понять, если подумать об этих двух методах с точки зрения их полезности.
.str.replace
- это метод, имеющий очень специальное назначение - выполнить подстановку строки или регулярное выражение для данных string .
OTOH, .replace
- это универсальный Швейцарский армейский нож , который может заменить что угодно на что-нибудь еще (и да, это включает строку и регулярное выражение).
Рассмотрим простой DataFrame, приведенный ниже, он станет основой нашего предстоящего обсуждения.
# Setup
df = pd.DataFrame({
'A': ['foo', 'another foo bar', 'baz'],
'B': [0, 1, 0]
})
df
A B
0 foo 0
1 another foo bar 1
2 baz 0
Основные различия между двумя функциями можно суммировать как
- Назначение
- Использование
- Поведение по умолчанию
Используйте str.replace
для замены подстрок в одном столбце строки и replace
для любой общей замены в одном или нескольких столбцах.
Рынок документации str.replace
как метод "простой замены строки", поэтому этот вариант должен быть вашим первым выбором при выполнении подстановки строки / регулярного выражения в ряду или столбце панд - воспринимайте его как "векторизованный" эквивалент Python Строка replace()
функция (или re.sub()
, чтобы быть более точным).
# simple substring replacement
df['A'].str.replace('foo', 'bar', regex=False)
0 bar
1 another bar bar
2 baz
Name: A, dtype: object
# simple regex replacement
df['A'].str.replace('ba.', 'xyz')
0 foo
1 another foo xyz
2 xyz
Name: A, dtype: object
replace
работает как для строковых, так и для нестроковых замен. Более того, он также предназначен для ** работы с несколькими столбцами одновременно (вы также можете обращаться к replace
как к методу DataFrame df.replace()
, если вам нужно заменить значения во всем DataFrame.
# DataFrame-wide replacement
df.replace({'foo': 'bar', 1: -1})
A B
0 bar 0
1 another foo bar -1
2 baz 0
str.replace
может заменить одну вещь за раз. replace
позволяет вам выполнять несколько независимых замен, то есть заменять сразу несколько вещей.
Вы можете указать только одну подстроку или шаблон регулярного выражения для str.replace
. repl
может вызываться (см. Документы), поэтому есть возможность проявить творческий подход с помощью регулярных выражений, чтобы несколько имитировать множественные замены подстрок, но эти решения в лучшем случае являются хакерскими).
Распространенный шаблон pandaic (pandorable, pandonic) - это использование str.replace
для удаления нескольких нежелательных подстрок с помощью разделения строк с помощью регулярного выражения OR pipe |
, а строка замены - ''
(пустая строка) .
replace
предпочтительнее, если у вас есть несколько независимых замен вида {'pat1': 'repl1', 'pat2':
repl2 , ...}
. Существуют различные способы указания независимых замен (списки, серии, надписи и т. Д.). См. документацию .
Чтобы проиллюстрировать разницу,
df['A'].str.replace('foo', 'text1').str.replace('bar', 'text2')
0 text1
1 another text1 text2
2 baz
Name: A, dtype: object
Было бы лучше выразить как
df['A'].replace({'foo': 'text1', 'bar': 'text2'}, regex=True)
0 text1
1 another text1 text2
2 baz
Name: A, dtype: object
В контексте строковых операций str.replace
разрешает замену регулярных выражений по умолчанию. replace
выполняет полное совпадение, только если не используется переключатель regex=True
.
Все, что вы делаете с str.replace
, вы также можете делать с replace
. Однако важно отметить следующие различия в поведении по умолчанию обоих методов.
- замены подстрок -
str.replace
будет заменять каждое вхождение подстроки, replace
будет выполнять только целые совпадения слов по умолчанию
- замена регулярного выражения -
str.replace
интерпретирует первый аргумент как регулярное выражение, если вы не укажете regex=False
. replace
полная противоположность.
Сравните разницу между
df['A'].replace('foo', 'bar')
0 bar
1 another foo bar
2 baz
Name: A, dtype: object
И
df['A'].replace('foo', 'bar', regex=True)
0 bar
1 another bar bar
2 baz
Name: A, dtype: object
Стоит также отметить, что вы можете только выполнять замену строки при regex=True
. Так, например, df.replace({'foo': 'bar', 1: -1}, regex=True)
будет недействительным.
TLDR;
Подводя итог, основные различия:
Назначение . Используйте str.replace
для замены подстроки в одном столбце строки и replace
для любой общей замены в одном или нескольких
столбцы.
Использование . str.replace
может заменить одну вещь за раз. replace
позволяет выполнять несколько независимых замен, т.е. заменять многие вещи
сразу.
Поведение по умолчанию . str.replace
разрешает замену регулярных выражений по умолчанию. replace
выполняет полное совпадение, только если не используется переключатель regex=True
.