В чем разница между Series.replace и Series.str.replace? - PullRequest
4 голосов
/ 17 июня 2019

Часто передо мной ставится задача выполнить какую-либо операцию замены или замены данных в столбцах Series или DataFrames.

Например, для данной серии строк

s = pd.Series(['foo', 'another foo bar', 'baz'])

0                foo
1    another foo bar
2                baz
dtype: object

Целью было бы заменить все вхождения "foo" на "bar", чтобы получить

0                bar
1    another bar bar
2                baz
Name: A, dtype: object

На данный момент я обычно смущен, поскольку есть два варианта, которые я могу использовать для решения этой проблемы: replace и str.replace. Путаница возникает из-за того, что я не уверен в том, какой метод использовать, или в чем разница (если есть) между ними.

Каковы основные различия между replace и str.replace, и каковы преимущества / предостережения от использования любого из них?

1 Ответ

12 голосов
/ 17 июня 2019

Перейти к 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

Основные различия между двумя функциями можно суммировать как

  1. Назначение
  2. Использование
  3. Поведение по умолчанию

Используйте 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. Однако важно отметить следующие различия в поведении по умолчанию обоих методов.

  1. замены подстрок - str.replace будет заменять каждое вхождение подстроки, replace будет выполнять только целые совпадения слов по умолчанию
  2. замена регулярного выражения - 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;

Подводя итог, основные различия:

  1. Назначение . Используйте str.replace для замены подстроки в одном столбце строки и replace для любой общей замены в одном или нескольких столбцы.

  2. Использование . str.replace может заменить одну вещь за раз. replace позволяет выполнять несколько независимых замен, т.е. заменять многие вещи сразу.

  3. Поведение по умолчанию . str.replace разрешает замену регулярных выражений по умолчанию. replace выполняет полное совпадение, только если не используется переключатель regex=True.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...