DataFrame.take()
- доступ к срезу данных DataFrame
по позиции (метод для совместимости с numpy
);Series.take()
- доступ к срезу данных Series
по позиции (метод для совместимости с numpy
);Index.take()
- доступ к срезу данных Index
по позиции (метод для совместимости с numpy
);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