Spec-Zone.ru › pandas 2

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.

Значения в Series/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, так как существует всего несколько возможных регулярных выражений подстановки.

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

  • словарь:

    • Словари могут использоваться для указания различных значений замены для различных существующих значений. Например, {'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 должен быть строкой, скомпилированным регулярным выражением или списком, словарем, массивом ndarray или Series таких элементов. Если value также None, то это должен быть вложенный словарь или Series.

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

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

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

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

Если True, выполняет операцию на месте и возвращает None.

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

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

Устарело начиная с версии 2.1.0.

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

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

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

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

Устарело начиная с версии 2.1.0.

Возвращаемое значение:
Series/DataFrame

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

Исключения:
AssertionError
  • Если regex не является bool и to_replace не None.

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

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

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

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

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

См. также

Series.fillna

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

DataFrame.fillna

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

Series.where

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

DataFrame.where

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

DataFrame.map

Применение функции к элементу DataFrame.

Series.map

Сопоставление значений Series в соответствии с входным отображением или функцией.

Series.str.replace

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

Примечания

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

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

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

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

Примеры

Скалярные `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

Устарело начиная с версии 2.1.0: Параметр ‘method’ и поведение заполнения устарели.

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

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

Изменено в версии 1.4.0: Ранее явное значение None игнорировалось.

Когда regex=True, value не None и to_replace — строка, замена будет применена ко всем столбцам DataFrame.

>>> df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
...                    'B': ['a', 'b', 'c', 'd', 'e'],
...                    'C': ['f', 'g', 'h', 'i', 'j']})
>>> df.replace(to_replace='^[a-g]', value='e', regex=True)
    A  B  C
0  0  e  e
1  1  e  e
2  2  e  h
3  3  e  i
4  4  e  j

Если value не None и to_replace — словарь, ключи словаря будут столбцами DataFrame, к которым будет применена замена.

>>> df.replace(to_replace={'B': '^[a-c]', 'C': '^[h-j]'}, value='e', regex=True)
    A  B  C
0  0  e  f
1  1  e  g
2  2  e  e
3  3  d  e
4  4  e  e

© 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/2.2.2/reference/api/pandas.DataFrame.replace.html

Spec-Zone.ru

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