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