Сообщить об ошибке.

Методы .rename() и .rename_axis() объектов Series/DataFrame в pandas

Переименование/сопоставление столбцов и индексных меток в pandas

Содержание:


Обзор методов .rename() и .rename_axis()

Метод .rename() объектов Series/DataFrame позволяет перемаркировать ось на основе некоторого сопоставления (словаря или серии) или произвольной функции.

>>> import pandas as pd
>>> import numpy as np
>>> s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
>>> s
# a   -0.485214
# b    1.546495
# c   -0.496277
# d    2.006134
# e   -0.438663
# dtype: float64

>>> s.rename(str.upper)
# A   -0.485214
# B    1.546495
# C   -0.496277
# D    2.006134
# E   -0.438663
# dtype: float64

Если передается функция, то она должна возвращать значение при вызове с любой из меток (и должна создавать набор уникальных значений). Также можно использовать словарь dict или Series:

df = pd.DataFrame(
    {
        "one": pd.Series(np.random.randn(3), index=["a", "b", "c"]),
        "two": pd.Series(np.random.randn(4), index=["a", "b", "c", "d"]),
        "three": pd.Series(np.random.randn(3), index=["b", "c", "d"]),
    }
)

>>> df
#         one       two     three
# a -0.826557 -0.564500       NaN
# b -0.208274  0.220010  0.292087
# c -0.249032  0.727930 -0.757377
# d       NaN -1.258104 -0.742752


# переименовываем столбцы и индексные метки
>>> df.rename(
...     columns={"one": "foo", "two": "bar"},
...     index={"a": "apple", "b": "banana", "d": "durian"},
... )
#              foo       bar     three
# apple  -0.826557 -0.564500       NaN
# banana -0.208274  0.220010  0.292087
# c      -0.249032  0.727930 -0.757377
# durian       NaN -1.258104 -0.742752

Если словарь не включает метку столбца/индекса, то она не переименовывается. Обратите внимание, что дополнительные метки в сопоставлении не вызывают ошибки.

DataFrame.rename() также поддерживает соглашение о вызовах в стиле оси, где указывается один преобразователь mapper и ось axis, к которой будет применено это сопоставление (функция или словарь).

>>> df.rename({"one": "foo", "two": "bar"}, axis="columns")
#         foo       bar     three
# a -0.826557 -0.564500       NaN
# b -0.208274  0.220010  0.292087
# c -0.249032  0.727930 -0.757377
# d       NaN -1.258104 -0.742752


>>> df.rename({"a": "apple", "b": "banana", "d": "durian"}, axis="index")
#              one       two     three
# apple  -0.826557 -0.564500       NaN
# banana -0.208274  0.220010  0.292087
# c      -0.249032  0.727930 -0.757377
# durian       NaN -1.258104 -0.742752

Наконец, метод .rename() также принимает скаляр или список для изменения атрибута Series.name.

>>> s.rename("scalar-name")
# a   -0.485214
# b    1.546495
# c   -0.496277
# d    2.006134
# e   -0.438663
# Name: scalar-name, dtype: float64

Методы DataFrame.rename_axis() и Series.rename_axis() позволяют изменять определенные имена MultiIndex (в отличие от меток).

df = pd.DataFrame(
    {"x": [1, 2, 3, 4, 5, 6], "y": [10, 20, 30, 40, 50, 60]},
    index=pd.MultiIndex.from_product(
        [["a", "b", "c"], [1, 2]], names=["let", "num"]
    ),
)

>>> df
#          x   y
# let num       
# a   1    1  10
#     2    2  20
# b   1    3  30
#     2    4  40
# c   1    5  50
#     2    6  60

>>> df.rename_axis(index={"let": "abc"})
#          x   y
# abc num       
# a   1    1  10
#     2    2  20
# b   1    3  30
#     2    4  40
# c   1    5  50
#     2    6  60

>>> df.rename_axis(index=str.upper)
#          x   y
# LET NUM       
# a   1    1  10
#     2    2  20
# b   1    3  30
#     2    4  40
# c   1    5  50
#     2    6  60

DataFrame.rename(mapper=None, *, index=None, columns=None, axis=None, copy=None, inplace=False, level=None, errors='ignore'):

Метод DataFrame.rename() переименовывает столбцы или метки индексов. Значения функции/словаря должны быть уникальными (один-к-одному). Метки, не содержащиеся в словаре/Series, останутся как есть. Перечисленные отсутствующие метки ошибок не вызывают.

Принимаемые аргументы:

  • mapper=None - словарь или вызываемый объект для преобразования, применяемые к значениям этой оси. Одновременно используется аргументы либо mapper и axis, чтобы указать целевую ось для сопоставителя, либо index и columns.
  • index=None - альтернатива указанию axis (указание аргументов mapper, axis=0 эквивалентно index=mapper).
  • columns=None - альтернатива указанию axis (указание аргументов mapper, axis=1 эквивалентно columns=mapper).
  • axis=None - ось для таргетинга с помощью mapper. Может быть либо именем оси (index, columns), либо номером (0, 1). По умолчанию используется index.
  • inplace=False - следует ли изменять DataFrame, а не создавать новый. Если True, то аргумент copy игнорируется.
  • level=None - В случае MultiIndex будут переименовываться метки только на указанном уровне.
  • errors='ignore' - если передана строка ‘raise’, то поднимется исключение KeyError, когда mapper, index или columns содержат метки, которых нет в преобразуемом индексе. Если 'ignore', то существующие ключи будут переименованы, а несуществующие будут проигнорированы.
  • copy=None - копирует базовые данные.

    Ключевой аргумент copy изменит поведение в pandas 3.0. Копирование при записи будет включено по умолчанию, что означает, что все методы с copy будут использовать механизм отложенного копирования. Ключевое слово copy будет удалено в будущей версии pandas. Эту функциональность уже можно включить установив pd.options.mode.copy_on_write = True

Примеры переименования столбцов или индексов DataFrame:

DataFrame.rename() поддерживает два соглашения о вызовах:

  • (index=indexmapper, columns=columnsmapper, ...)
  • (mapper, axis={'index', 'columns'}, ...)

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

Переименовывание столбцов с помощью словаря:

>>> df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
>>> df.rename(columns={"A": "a", "B": "c"})
#    a  c
# 0  1  4
# 1  2  5
# 2  3  6

Переименовывание индекса с помощью словаря:

>>> df.rename(index={0: "x", 1: "y", 2: "z"})
#    A  B
# x  1  4
# y  2  5
# z  3  6

Приведение индексных меток к другому типу:

>>> df.index
# RangeIndex(start=0, stop=3, step=1)
>>> df.rename(index=str).index
# Index(['0', '1', '2'], dtype='object')

Поведение метода при аргументе errors="raise":

>>> df.rename(columns={"A": "a", "B": "b", "C": "c"}, errors="raise")
# Traceback (most recent call last):
# ...
#     raise KeyError(f"{missing_labels} not found in axis")

Использование аргументов "стиля оси":

>>> df.rename(str.lower, axis='columns')
#    a  b
# 0  1  4
# 1  2  5
# 2  3  6

>>> df.rename({1: 2, 2: 4}, axis='index')
#    A  B
# 0  1  4
# 2  2  5
# 4  3  6

Series.rename(index=None, *, copy=None, inplace=False, level=None, errors='ignore'):

Метод Series.rename() переименовывает индексные метки или имя самой серии Series.

Значения функции/словаря должны быть уникальными (1-к-1). Метки, не содержащиеся в dict/Series, останутся как есть. Перечисленные несуществующие метки не вызывают ошибок при errors='ignore'.

Альтернативно изменить имя серии на скалярное значение можно атрибутом Series.name.

Принимаемые аргументы:

  • index=None - функция или сопоставление (например, словарь), применяемые к индексу. Скалярная или хешируемая последовательность будет изменять атрибут Series.name.
  • inplace=False - следует ли изменять Series, а не создавать новый. Если True, то аргумент copy игнорируется.
  • level=None - В случае MultiIndex будут переименовываться индексные метки только на указанном уровне.
  • errors='ignore' - если передана строка ‘raise’, то поднимется исключение KeyError, когда index содержит метки, которых нет в преобразуемом индексе. Если 'ignore', то существующие ключи будут переименованы, а несуществующие будут проигнорированы.
  • copy=None - копирует базовые данные.

    Ключевой аргумент copy изменит поведение в pandas 3.0. Копирование при записи будет включено по умолчанию, что означает, что все методы с copy будут использовать механизм отложенного копирования. Ключевое слово copy будет удалено в будущей версии pandas. Эту функциональность уже можно включить установив pd.options.mode.copy_on_write = True

Примеры переименования индексных меток в Series:

>>> import pandas as pd
>>> s = pd.Series([1, 2, 3])
>>> s
# 0    1
# 1    2
# 2    3
# dtype: int64

Скаляр меняет Series.name

>>> s.rename("my_name")
# 0    1
# 1    2
# 2    3
# Name: my_name, dtype: int64

Функция изменяет индексные метки

>>> s.rename(lambda x: x ** 2)
# 0    1
# 1    2
# 4    3
# dtype: int64

Словарь изменяет индексные метки

>>> s.rename({1: 3, 2: 5})
# 0    1
# 3    2
# 5    3
# dtype: int64

Index.rename(name, *, inplace=False):

Метод Index.rename() изменяет имя индекса или MultiIndex.

Другими словами, этот метод дает возможность устанавливать новые имена без уровня. По умолчанию возвращается новый индекс. Длина имен должна соответствовать количеству уровней в MultiIndex.

Принимаемые аргументы:

  • name - индексная метка или их список для переименования.
  • inplace=False - изменяет объект напрямую, вместо создания нового индекса или MultiIndex.

Примеры переименования Index или его индексных меток:

Изменяем имя индекса Index:

>>> import pandas as pd
>>> idx = pd.Index(['A', 'C', 'A', 'B'], name='score')
>>> idx.rename('grade')
# Index(['A', 'C', 'A', 'B'], dtype='object', name='grade')

Работа с MultiIndex:

idx = pd.MultiIndex.from_product([['python', 'cobra'],
                                  [2018, 2019]],
                                  names=['kind', 'year'])

>>> idx
# MultiIndex([('python', 2018),
#             ('python', 2019),
#             ( 'cobra', 2018),
#             ( 'cobra', 2019)],
#            names=['kind', 'year'])

>>> idx.rename(['species', 'year'])
# MultiIndex([('python', 2018),
#             ('python', 2019),
#             ( 'cobra', 2018),
#             ( 'cobra', 2019)],
#            names=['species', 'year'])

>>> idx.rename('species')
# Traceback (most recent call last):
# TypeError: Must pass list-like as `names`.

- DataFrame.rename_axis(mapper=no_default, *, index=no_default, columns=no_default, axis=0, copy=None, inplace=False):
- Series.rename_axis(mapper=no_default, *, index=no_default, copy=True, inplace=False):

Метод DataFrame.rename_axis() и Series.rename_axis() переименовывает имя оси для индекса или столбцов.

Принимаемые аргументы:

  • mapper=no_default - значение для установки атрибута имени оси. Принимает скалярное значение или список.
  • index, columns - преобразователь, может быть скалярным значением, списком, словарем или вызываемым объектом, которые будут применяться к значениям этой оси. Обратите внимание, что аргумент columns недопустим, если объект представляет собой серию Series. Эти аргументы применяется только к объектам типа DataFrame.
  • axis=0 - ось, которую нужно переименовать. Для Series этот аргумент не используется и по умолчанию равен 0.
  • inplace=False - изменяет объект напрямую, вместо создания новой Series или DataFrame.
  • copy=None - копирует базовые данные.

    Ключевой аргумент copy изменит поведение в pandas 3.0. Копирование при записи будет включено по умолчанию, что означает, что все методы с copy будут использовать механизм отложенного копирования. Ключевое слово copy будет удалено в будущей версии pandas. Эту функциональность уже можно включить установив pd.options.mode.copy_on_write = True

Примеры переименования имен осей:

Метод DataFrame.rename_axis() поддерживает два соглашения о вызовах.

  • (index=index_mapper, columns=columns_mapper, ...);
  • (mapper, axis={'index', 'columns'}, ...).

Первое соглашение о вызовах будет изменять только имена индекса и/или имена объекта Index, который является столбцами. В этом аргумент copy игнорируется.

Второе соглашение о вызовах изменит имена соответствующего индекса, если преобразователь mapper является списком или скаляром. Однако, если mapper - это словарь dict или функция, то он будет использовать устаревшее поведение изменения меток осей.

Настоятельно рекомендуется использовать ключевые аргументы, чтобы прояснить ваши намерения.

Пример для Series:

>>> import pandas as pd
>>> s = pd.Series(["dog", "cat", "monkey"])
>>> s
# 0       dog
# 1       cat
# 2    monkey
# dtype: object

>>> s.rename_axis("animal")
# animal
# 0    dog
# 1    cat
# 2    monkey
# dtype: object

Пример для DataFrame:

df = pd.DataFrame({"num_legs": [4, 4, 2],
                   "num_arms": [0, 0, 2]},
                  ["dog", "cat", "monkey"])

>>> df
#         num_legs  num_arms
# dog            4         0
# cat            4         0
# monkey         2         2

Переименование названия индекса строк

>>> df = df.rename_axis("animal")
>>> df
#         num_legs  num_arms
# animal
# dog            4         0
# cat            4         0
# monkey         2         2

Переименование названия индекса столбцов

>>> df = df.rename_axis("limbs", axis="columns")
>>> df
# limbs   num_legs  num_arms
# animal
# dog            4         0
# cat            4         0
# monkey         2         2

Пример для MultiIndex:

df.index = pd.MultiIndex.from_product([['mammal'],
                                       ['dog', 'cat', 'monkey']],
                                      names=['type', 'name'])

>>> df
# limbs          num_legs  num_arms
# type   name
# mammal dog            4         0
#        cat            4         0
#        monkey         2         2
>>> df.rename_axis(index={'type': 'class'})
# limbs          num_legs  num_arms
# class  name
# mammal dog            4         0
#        cat            4         0
#        monkey         2         2
>>> df.rename_axis(columns=str.upper)
# LIMBS          num_legs  num_arms
# type   name
# mammal dog            4         0
#        cat            4         0
#        monkey         2         2