Spec-Zone.ru › pandas 1

pandas.DataFrame.replace

DataFrame.replace(to_replace=None, value=_NoDefault.no_default, inplace=False, limit=None, regex=False, method=_NoDefault.no_default)[source]

Замените значения, указанные в to_replace, на value.

Значения DataFrame заменяются на другие значения динамически.

Это отличается от обновления с .loc или .iloc, которые требуют указания местоположения для обновления некоторым значением.

Параметры
to_replace:str, regex, список, dict, Series, int, float или None

Как найти значения, которые будут заменены.

  • числовое, строковое или регулярное выражение:

    • числовое: числовые значения, равные to_replace, будут заменены на value

    • строковое: строка, точно совпадающая с to_replace, будет заменена на value

    • регулярное выражение: регулярные выражения, соответствующие to_replace, будут заменены на value

  • список строк, регулярных выражений или числовых значений:

    • Во-первых, если to_replace и value — оба списки, они должны иметь одинаковую длину.

    • Во-вторых, если regex=True, то все строки в обоих списках будут интерпретированы как регулярные выражения, в противном случае они будут сопоставляться напрямую. Это не имеет большого значения для value, так как есть всего несколько возможных подстановочных регулярных выражений, которые вы можете использовать.

    • Правила для строк, регулярных выражений и числовых значений применяются как и выше.

  • dict:

    • Словари могут быть использованы для указания различных значений замены для различных существующих значений. Например, {'a': 'b', 'y': 'z'} заменяет значение ‘a’ на ‘b’ и ‘y’ на ‘z’. Для использования словаря таким образом, необязательный параметр value не должен быть указан.

    • Для DataFrame словарь может указать, что разные значения должны быть заменены в разных столбцах. Например, {'a': 1, 'b': 'z'} ищет значение 1 в столбце ‘a’ и значение ‘z’ в столбце ‘b’ и заменяет эти значения на то, что указано в value. Параметр value не должен быть None в этом случае. Вы можете рассматривать это как специальный случай передачи двух списков, за исключением того, что вы указываете столбец для поиска.

    • Для DataFrame вложенные словари, например, {'a': {'b': np.nan}}, читаются следующим образом: ищется значение ‘b’ в столбце ‘a’ и заменяется на NaN. Необязательный параметр value не должен быть указан, чтобы использовать вложенный словарь таким образом. Вы также можете вкладывать регулярные выражения. Обратите внимание, что имена столбцов (ключи словаря верхнего уровня во вложенном словаре) не могут быть регулярными выражениями.

  • None:

    • Это означает, что аргумент regex должен быть строкой, скомпилированным регулярным выражением или списком, словарем, массивом NumPy или Series таких элементов. Если value также None, то это должен быть вложенный словарь или Series.

Примеры каждого из этих способов приведены в разделе примеров.

value:скаляр, dict, список, строка, регулярное выражение, по умолчанию None

Значение, на которое нужно заменить все значения, соответствующие to_replace. Для DataFrame можно использовать словарь значений, чтобы указать, какое значение использовать для каждого столбца (столбцы, которые не находятся в словаре, не будут заполнены). Также разрешены регулярные выражения, строки и списки или словари таких объектов.

inplace:bool, по умолчанию False

Модифицировать DataFrame вместо создания нового.

limit:int, по умолчанию None

Максимальная величина разрыва для заполнения вперед или назад.

regex:bool или тот же тип, что и to_replace, по умолчанию False

Интерпретировать to_replace и/или value как регулярные выражения. Если это True, то to_replace должен быть строкой. В качестве альтернативы это может быть регулярное выражение или список, словарь или массив регулярных выражений, в этом случае to_replace должен быть None.

method:{‘pad’, ‘ffill’, ‘bfill’}

Метод, используемый при замене, когда to_replace — это скаляр, список или кортеж, а value — None.

Изменено в версии 0.23.0: Добавлено в DataFrame.

Возвращает
DataFrame

Объект после замены.

Возможные исключения
AssertionError
  • Если regex не bool и to_replace не None.

TypeError
  • Если to_replace не скаляр, массив-подобный, dict, или None

  • Если to_replace является dict и value не list, dict, ndarray, или Series

  • Если to_replace None и regex не может быть скомпилировано в регулярное выражение или является списком, словарем, массивом NumPy или Series.

  • При замене нескольких bool или datetime64 объектов, и аргументы to_replace не совпадают с типом заменяемого значения.

ValueError
  • Если в to_replace и value передаётся list или ndarray, но они не имеют одинаковую длину.

См. также

DataFrame.fillna

Заполнение пропущенных значений.

DataFrame.where

Замена значений на основе булевого условия.

Series.str.replace

Простая замена строк.

Примечания

  • Замена регулярных выражений выполняется под капотом с re.sub. Правила замены для re.sub те же.

  • Регулярные выражения будут заменять только строки, то есть вы не можете указать, например, регулярное выражение, соответствующее числам с плавающей запятой, и ожидать, что столбцы в вашей таблице, имеющие числовой тип данных, будут сопоставлены. Однако, если эти числа с плавающей запятой являются строками, то вы можете это сделать.

  • У этого метода очень много вариантов. Рекомендуется экспериментировать и играть с этим методом, чтобы получить интуитивное представление о его работе.

  • Когда dict используется в качестве значения to_replace, ключи(и) в словаре — это часть to_replace, а значения(и) в словаре — это параметр value.

Примеры

Скалярный `to_replace` и `value`

>>> s = pd.Series([1, 2, 3, 4, 5])
>>> s.replace(1, 5)
0    5
1    2
2    3
3    4
4    5
dtype: int64
>>> df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
...                    'B': [5, 6, 7, 8, 9],
...                    'C': ['a', 'b', 'c', 'd', 'e']})
>>> df.replace(0, 5)
    A  B  C
0  5  5  a
1  1  6  b
2  2  7  c
3  3  8  d
4  4  9  e

Список `to_replace`

>>> df.replace([0, 1, 2, 3], 4)
    A  B  C
0  4  5  a
1  4  6  b
2  4  7  c
3  4  8  d
4  4  9  e
>>> df.replace([0, 1, 2, 3], [4, 3, 2, 1])
    A  B  C
0  4  5  a
1  3  6  b
2  2  7  c
3  1  8  d
4  4  9  e
>>> s.replace([1, 2], method='bfill')
0    3
1    3
2    3
3    4
4    5
dtype: int64

Словарь `to_replace`

>>> df.replace({0: 10, 1: 100})
        A  B  C
0   10  5  a
1  100  6  b
2    2  7  c
3    3  8  d
4    4  9  e
>>> df.replace({'A': 0, 'B': 5}, 100)
        A    B  C
0  100  100  a
1    1    6  b
2    2    7  c
3    3    8  d
4    4    9  e
>>> df.replace({'A': {0: 100, 4: 400}})
        A  B  C
0  100  5  a
1    1  6  b
2    2  7  c
3    3  8  d
4  400  9  e

Регулярное выражение `to_replace`

>>> df = pd.DataFrame({'A': ['bat', 'foo', 'bait'],
...                    'B': ['abc', 'bar', 'xyz']})
>>> df.replace(to_replace=r'^ba.$', value='new', regex=True)
        A    B
0   new  abc
1   foo  new
2  bait  xyz
>>> df.replace({'A': r'^ba.$'}, {'A': 'new'}, regex=True)
        A    B
0   new  abc
1   foo  bar
2  bait  xyz
>>> df.replace(regex=r'^ba.$', value='new')
        A    B
0   new  abc
1   foo  new
2  bait  xyz
>>> df.replace(regex={r'^ba.$': 'new', 'foo': 'xyz'})
        A    B
0   new  abc
1   xyz  new
2  bait  xyz
>>> df.replace(regex=[r'^ba.$', 'foo'], value='new')
        A    B
0   new  abc
1   new  new
2  bait  xyz

Сравните поведение s.replace({'a': None}) и s.replace('a', None), чтобы понять особенности параметра to_replace:

>>> s = pd.Series([10, 'a', 'a', 'b', 'a'])

Когда используется словарь как значение to_replace, это похоже на то, что значения(я) в словаре равны параметру value. s.replace({'a': None}) эквивалентно s.replace(to_replace={'a': None}, value=None, method=None):

>>> s.replace({'a': None})
0      10
1    None
2    None
3       b
4    None
dtype: object

Когда value не передаётся явно, а to_replace — скаляр, список или кортеж, replace использует параметр метода (по умолчанию ‘pad’) для замены. Поэтому в этом случае значения 'a' заменяются на 10 в строках 1 и 2, а 'b' — в строке 4.

>>> s.replace('a')
0    10
1    10
2    10
3     b
4     b
dtype: object

С другой стороны, если None явно передаётся для value, он будет учтён:

>>> s.replace('a', None)
0      10
1    None
2    None
3       b
4    None
dtype: object

Изменено в версии 1.4.0: Ранее явное указание None игнорировалось без предупреждения.

© 2008–2022, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/1.5.0/reference/api/pandas.DataFrame.replace.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API