Нашли ошибку?
среднийpandas 3.0.6

Замена значений: replace

Заменить конкретные значения — опечатки, коды «нет данных», варианты написания — во всей таблице или в отдельных столбцах.

Нужно знать:Выбор столбцов

Содержание статьи

Коротко

  • replace(старое, новое) заменяет целые значения ячеек. Подстроку внутри текста меняет .str.replace.
  • Словарь {старое: новое} — несколько замен сразу; список старых значений — все в одно новое.
  • Вложенный словарь {"столбец": {старое: новое}} — замены только в указанных столбцах.
  • regex=True — старое значение как регулярное выражение.
  • replace оставляет незнакомые значения как есть, а map со словарём превращает их в NaN.

Синтаксис

s.replace(old, new)
s.replace({"a": "b", "c": "d"})
df.replace(["x", "y"], np.nan)
df.replace({"col": {old: new}})
s.replace(pattern, new, regex=True)

Параметры

ПараметрЧто делаетПо умолчанию
to_replaceчто заменить: значение, список, словарь, регулярное выражениеобязательный
valueна что заменить; не нужен, если to_replace — словарь заменNone
regexсчитать to_replace регулярным выражениемFalse
inplaceизменить на месте; в pandas 3 возвращает саму таблицуFalse

Примеры

Данные для примеровиспользуются во всех примерах ниже
survey = pd.DataFrame({
    "city": ["Спб", "Москва", "С.-Петербург", "мск", "Москва"],
    "answer": ["да", "нет", "н/д", "да", "-"],
    "score": [5, -1, 4, 3, -1],        # -1 — «нет ответа»
})
Код «нет ответа» в NaN
survey["score"].replace(-1, np.nan)
Вывод
0    5.0
1    NaN
2    4.0
3    3.0
4    NaN
Name: score, dtype: float64
Словарь замен
survey["city"].replace({"Спб": "Санкт-Петербург", "С.-Петербург": "Санкт-Петербург", "мск": "Москва"})
Вывод
0    Санкт-Петербург
1             Москва
2    Санкт-Петербург
3             Москва
4             Москва
Name: city, dtype: str
Несколько значений в одно
survey.replace(["н/д", "-"], np.nan)          # несколько значений — в одно
Вывод
           city answer  score
0           Спб     да      5
1        Москва    нет     -1
2  С.-Петербург    NaN      4
3           мск     да      3
4        Москва    NaN     -1
Замены по столбцам
survey.replace({"answer": {"да": "yes", "нет": "no"}, "score": {-1: 0}})
Вывод
           city answer  score
0           Спб    yes      5
1        Москва     no      0
2  С.-Петербург    н/д      4
3           мск    yes      3
4        Москва      -      0
Регулярное выражение
survey["city"].replace(r"^С.*[Пп]етербург$|^Спб$", "Санкт-Петербург", regex=True)
Вывод
0    Санкт-Петербург
1             Москва
2    Санкт-Петербург
3                мск
4             Москва
Name: city, dtype: str

Подводные камни

replace меняет только целые значения

Чтобы заменить часть текста, нужен .str.replace — см. строки.

Значение и подстрока
print(survey["city"].replace("Москва", "МСК").tolist())   # только целое значение
survey["city"].str.replace("о", "0").tolist()             # подстрока — это .str.replace
Вывод
['Спб', 'МСК', 'С.-Петербург', 'мск', 'МСК']
['Спб', 'М0сква', 'С.-Петербург', 'мск', 'М0сква']

replace и map со словарём

Незнакомые значения
codes = {"да": 1, "нет": 0}
print(survey["answer"].replace(codes).tolist())   # незнакомые значения остаются
survey["answer"].map(codes).tolist()              # незнакомые — NaN
Вывод
[1, 0, 'н/д', 1, '-']
[1.0, 0.0, nan, 1.0, nan]

inplace=True возвращает таблицу

Результат replace(..., inplace=True)
result = survey.replace(-1, 0, inplace=True)
result is survey                                   # pandas 3: inplace возвращает саму таблицу
Вывод
True