Spec-Zone.ru › pandas 0.25

pandas.DataFrame.replace

DataFrame.replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad') [source]

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

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

Параметры:
to_replace : str, regex, list, dict, Series, int, float, or 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 должен быть None.
    • Для DataFrame словарь может указать, что разные значения должны быть заменены в разных столбцах. Например, {'a': 1, 'b': 'z'} ищет значение 1 в столбце 'a' и значение 'z' в столбце 'b' и заменяет эти значения на то, что указано в value. Параметр value не должен быть None в этом случае. Вы можете рассматривать это как частный случай передачи двух списков, за исключением того, что вы указываете столбец для поиска.
    • Для DataFrame вложенные словари, например, {'a': {'b': np.nan}}, читаются следующим образом: ищите значение 'b' в столбце 'a' и замените его на NaN. Параметр value должен быть None, чтобы использовать вложенный словарь таким образом. Вы также можете вкладывать регулярные выражения. Обратите внимание, что имена столбцов (ключи словаря верхнего уровня во вложенном словаре) не могут быть регулярными выражениями.
  • None:

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

См. раздел "Примеры" для примеров каждого из них.

value : scalar, dict, list, str, regex, default None

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

inplace : bool, default False

Если True, на месте. Примечание: это изменит любые другие представления этого объекта (например, столбец из DataFrame). Возвращает вызывающий объект, если это True.

limit : int, default None

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

regex : bool or same types as to_replace, default False

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

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

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

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

Возвращает:
DataFrame

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

Возможные исключения:
AssertionError
  • Если regex не является bool и to_replace не является None.
TypeError
  • Если to_replace является dict и value не является list, dict, ndarray, или Series
  • Если to_replace является None и regex не может быть скомпилировано в регулярное выражение или является списком, словарем, массивом ndarray или Series.
  • При замене нескольких bool или datetime64 объектов и аргументы to_replace не соответствуют типу заменяемого значения
ValueError
  • Если list или ndarray передается в to_replace и value, но они не имеют одинаковой длины.

См. также

DataFrame.fillna
Заполнение пропущенных значений.
DataFrame.where
Замена значений на основе булевого условия.
Series.str.replace
Простая замена строк.

Примечания

  • Замена регулярных выражений выполняется под капотом с помощью re.sub. Правила замены для re.sub такие же.
  • Регулярные выражения будут заменять только строки, что означает, что вы не можете, например, указать регулярное выражение, соответствующее числам с плавающей запятой, и ожидать, что столбцы в вашем фрейме, имеющие числовой тип данных, будут сопоставлены. Однако, если эти числа с плавающей запятой являются строками, то вы можете это сделать.
  • Этот метод имеет много вариантов. Вам рекомендуется экспериментировать и играть с этим методом, чтобы получить интуицию о том, как он работает.
  • Когда в качестве значения to_replace используется словарь, ключи в словаре — это часть to_replace, а значения в словаре — это параметр value.

Примеры

Скалярное `to_replace` и `value`

>>> s = pd.Series([0, 1, 2, 3, 4])
>>> s.replace(0, 5)
0    5
1    1
2    2
3    3
4    4
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    0
1    3
2    3
3    3
4    4
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

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

>>> df = pd.DataFrame({'A': [True, False, True],
...                    'B': [False, True, False]})
>>> df.replace({'a string': 'new value', True: False})  # raises
Traceback (most recent call last):
    ...
TypeError: Cannot compare types 'ndarray(dtype=bool)' and 'str'

Это вызывает TypeError, потому что один из ключей dict не имеет правильного типа для замены.

Сравните поведение 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=None и to_replace является скалярным значением, списком или кортежем, replace использует параметр метода (по умолчанию 'pad') для замены. Поэтому в этом случае значения 'a' заменяются на 10 в строках 1 и 2, а 'b' в строке 4. Команда s.replace('a', None) фактически эквивалентна s.replace(to_replace='a', value=None, method='pad'):

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

© 2008–2012, 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/0.25.0/reference/api/pandas.DataFrame.replace.html

Spec-Zone.ru

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