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

Метод .take() объектов DataFrame/Series/Index в pandas

Выбор данных вдоль оси списком позиционных индексов

Содержание:


Series.take(indices, **kwargs):
DataFrame.take(indices, axis=0, **kwargs):

Методы Series.take() и DataFrame.take() возвращают элементы данных, находящихся в заданных позициях indices объектов Series/DataFrame. Это означает, что список позиций indices указывается согласно фактическому положению элемента в соответствующем объекте.

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

  • indices - массив/список целых чисел, указывающий, из каких позиций требуется извлечь данные.
  • axis=0 - ось, по которой выбираются элементы. 0 или 'index' означает, что выбираются строки, 1 или 'columns' означает, что выбираются столбцы. Для Series этот аргумент не используется и по умолчанию равен 0.
  • **kwargs - для совместимости с numpy.take(). Не влияет на вывод.

Примеры использования метод Series.take() и DataFrame.take():

>>> import pandas as pd
>>> import numpy as np
df = pd.DataFrame([('falcon', 'bird', 389.0),
                   ('parrot', 'bird', 24.0),
                   ('lion', 'mammal', 80.5),
                   ('monkey', 'mammal', np.nan)],
                  columns=['name', 'class', 'max_speed'],
                  index=[0, 2, 3, 1])
>>> df
#      name   class  max_speed
# 0  falcon    bird      389.0
# 2  parrot    bird       24.0
# 3    lion  mammal       80.5
# 1  monkey  mammal        NaN

Берет элементы в позициях 0 и 3 по оси 0 (по умолчанию).

Обратите внимание, что фактически выбранные индексные метки (0 и 1) не соответствуют выбранным позициям 0 и 3.

>>> df.take([0, 3])
#      name   class  max_speed
# 0  falcon    bird      389.0
# 1  monkey  mammal        NaN

Берем элементы с позиционными индексами 1 и 2 по оси 1 (столбец).

>>> df.take([1, 2], axis=1)
#     class  max_speed
# 0    bird      389.0
# 2    bird       24.0
# 3  mammal       80.5
# 1  mammal        NaN

Можно брать элементы, используя отрицательные целые числа, в качестве положительных индексов, начиная с конца объекта, как и в случае со списками Python.

>>> df.take([-1, -2])
#      name   class  max_speed
# 1  monkey  mammal        NaN
# 3    lion  mammal       80.5

Index.take(indices, allow_fill=True, fill_value=None, **kwargs):

Метод Index.take() возвращает новый индекс значений, выбранных indices. Список позиций indices указывается согласно фактическому положению элемента в объекте.

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

  • indices - массив/список целых чисел, указывающий, из каких позиций требуется извлечь данные.
  • allow_fill=True - смотри описание аргумента fill_value.
  • fill_value=None - если allow_fill=True и fill_value не равно None, то индексы, указанные значением -1, считаются NA . Если индекс не содержит NA, то возникает исключение ValueError .
  • **kwargs - для совместимости с numpy.take(). Не влияет на вывод.

Примеры использования метода Index.take():

>>> idx = pd.Index(['a', 'b', 'c'])
>>> idx.take([2, 2, 1, 2])
# Index(['c', 'c', 'b', 'c'], dtype='object')

Выбор данных вдоль оси списком позиционных индексов.

Небольшое замечание о производительности: так как метод .take() объектов Index/Series/DataFrame обрабатывает более узкий диапазон входных данных, он может обеспечить производительность, значительно превышающую производительность обычного индексирования .loc[] и .iloc[].

Index, Series и DataFrame предоставляют метод .take(), который извлекает элементы вдоль заданной оси по заданным позиционным индексам. Указанные индексы должны быть либо списком, либо массивом позиций целочисленных индексов. Метод .take() также принимает отрицательные целые числа в качестве позиций относительно конца объекта.

>>> import pandas as pd
>>> import numpy as np
>>> index = pd.Index(np.random.randint(0, 1000, 10))
>>> index
# Index([214, 502, 712, 567, 786, 175, 993, 133, 758, 329], dtype='int64')
>>> positions = [0, 9, 3]
>>> index[positions]
# Index([214, 329, 567], dtype='int64')
>>> index.take(positions)
# Index([214, 329, 567], dtype='int64')
>>> ser = pd.Series(np.random.randn(10))
>>> ser.iloc[positions]
# 0   -0.179666
# 9    1.824375
# 3    0.392149
# dtype: float64

>>> ser.take(positions)
# 0   -0.179666
# 9    1.824375
# 3    0.392149
# dtype: float64

Для DataFrames данные индексы должны быть списком 1d или numpy.ndarray, который определяет позиции строк или столбцов.

>>> frm = pd.DataFrame(np.random.randn(5, 3))
>>> frm.take([1, 4, 3])
#           0         1         2
# 1 -1.237881  0.106854 -1.276829
# 4  0.629675 -1.425966  1.857704
# 3  0.979542 -1.633678  0.615855

>>> frm.take([0, 2], axis=1)
#           0         2
# 0  0.595974  0.601544
# 1 -1.237881 -1.276829
# 2 -0.767101  1.499591
# 3  0.979542  0.615855
# 4  0.629675  1.857704

Важно отметить, что метод .take() объектов pandas НЕ ПРЕДНАЗНАЧЕН для работы с логическими операторами и может возвращать неожиданные результаты.

>>> arr = np.random.randn(10)
>>> arr
# array([-0.85087687, -0.30374928, -0.38772344,  1.19152042, -0.49715602,
#         0.2688488 , -1.03714584,  0.24092975,  0.29487095,  0.20540514])

>>> arr.take([False, False, True, True])
# array([-0.85087687, -0.85087687, -0.30374928, -0.30374928])

# понимаете о чем речь
>>> arr[[0, 1]]
# array([-0.85087687, -0.30374928])

>>> ser = pd.Series(np.random.randn(10))
>>> ser
# 0   -0.293532
# 1    0.147384
# 2    0.080274
# 3   -0.812621
# 4    1.136176
# 5    0.958868
# 6   -0.078712
# 7    0.702776
# 8    0.611545
# 9   -0.358883
# dtype: float64

>>> ser.take([False, False, True, True])
# 0   -0.293532
# 0   -0.293532
# 1    0.147384
# 1    0.147384
# dtype: float64

# тоже самое
>>> ser.iloc[[0, 1]]
# 0   -0.293532
# 1    0.147384
# dtype: float64