Spec-Zone.ru › pandas 0.22

Индексирование и выбор данных

Информация о маркировке осей в объектах pandas служит для многих целей:

  • Идентифицирует данные (т.е. предоставляет метаданные) с использованием известных индикаторов, что важно для анализа, визуализации и интерактивного отображения в консоли
  • Обеспечивает автоматическое и явное выравнивание данных
  • Позволяет интуитивно извлекать и устанавливать подмножества набора данных

В этом разделе мы сосредоточимся на последнем пункте: а именно, как нарезать, дробить и, в общем, извлекать и устанавливать подмножества объектов pandas. Основное внимание будет уделено объектам Series и DataFrame, так как они получили больше внимания в этом направлении. В будущем ожидается больше работы над многомерными структурами данных (включая Panel) , особенно в области продвинутого индексирования по меткам.

Примечание

Операторы индексирования Python и NumPy [] и оператор атрибута . обеспечивают быстрый и легкий доступ к структурам данных pandas в широком диапазоне случаев использования. Это делает интерактивную работу интуитивной, так как почти ничего нового не нужно изучать, если вы уже знаете, как работать со словарями Python и массивами NumPy. Однако, поскольку тип данных, к которому осуществляется доступ, не известен заранее, прямое использование стандартных операторов имеет некоторые ограничения по оптимизации. Для кода, используемого в производстве, рекомендуется использовать оптимизированные методы доступа к данным pandas, представленные в этой главе.

Предупреждение

Возвращается ли копия или ссылка при операции установки, может зависеть от контекста. Это иногда называют chained assignment и следует избегать. См. Возвращение представления или копии

Предупреждение

Индексирование на основе целого индекса с плавающей точкой было уточнено в версии 0.18.0. Подробнее о внесенных изменениях см. здесь.

См. Многоуровневый индекс/Продвинутое индексирование для MultiIndex и более подробной документации по индексированию.

См. сборник рецептов для некоторых продвинутых стратегий

Различные варианты индексирования

Выбор объекта был дополнен по запросу пользователей, чтобы поддержать более явное индексирование по местоположению. Pandas теперь поддерживает три типа индексирования по нескольким осям.

  • .loc в основном основан на метках, но также может использоваться с булевым массивом. .loc будет поднимать KeyError если элементы не найдены. Допустимые входные данные:

    • Единственная метка, например 5 или 'a', (обратите внимание, что 5 интерпретируется как метка индекса. Это использование не является целочисленной позицией вдоль индекса)
    • Список или массив меток ['a', 'b', 'c']
    • Объект среза с метками 'a':'f' (обратите внимание, что в отличие от обычных срезов Python, оба начальный и конечный элементы включены, если они присутствуют в индексе! - также см. Срез с метками)
    • Булевый массив
    • Функция callable с одним аргументом (вызываемый Series, DataFrame или Panel) и возвращающая допустимый результат для индексирования (один из вышеперечисленных)

      Введено в версии 0.18.1.

    См. больше в Выбор по метке

  • .iloc в основном основан на целочисленной позиции (от 0 до length-1 оси), но также может использоваться с булевым массивом. .iloc будет поднимать IndexError если запрошенный индексатор находится за пределами границ, за исключением индексаторов среза, которые допускают индексирование за пределами границ. (Это соответствует семантике среза python/numpy). Допустимые входные данные:

    • Целое число, например 5
    • Список или массив целых чисел [4, 3, 0]
    • Объект среза с целыми числами 1:7
    • Булевый массив
    • Функция callable с одним аргументом (вызываемый Series, DataFrame или Panel) и возвращающая допустимый результат для индексирования (один из вышеперечисленных)

      Введено в версии 0.18.1.

    См. больше в Выбор по позиции

    См. больше в Продвинутое индексирование и Продвинутое иерархическое.

  • .loc, .iloc, и также индексирование [] может принимать callable в качестве индексатора. Подробнее см. Выбор по вызываемой функции.

Извлечение значений из объекта с помощью многоосевого выбора использует следующий синтаксис (взято как пример .loc, но применяется и к .iloc). Любой из доступных к осям элементов может быть нулевым слайсом :. Оси, не указанные в спецификации, считаются :. (Например, p.loc['a'] эквивалентно p.loc['a', :, :]).

Тип объекта Индексаторы
Series s.loc[indexer]
DataFrame df.loc[row_indexer,column_indexer]
Panel p.loc[item_indexer,major_indexer,minor_indexer]

Основы

Как упоминалось при представлении структур данных в предыдущем разделе, основная функция индексирования с [] (также известная как __getitem__ для тех, кто знаком с реализацией поведения класса в Python) заключается в выборе подмножеств меньшей размерности. Таким образом,

Тип объекта Выбор Тип возвращаемого значения
Series series[label] скалярное значение
DataFrame frame[colname] Series соответствующее имени столбца
Panel panel[itemname] DataFrame соответствующее имени элемента

Здесь мы создаем простой временной ряд данных, чтобы проиллюстрировать функциональность индексирования:

In [1]: dates = pd.date_range('1/1/2000', periods=8)

In [2]: df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])

In [3]: df
Out[3]: 
                   A         B         C         D
2000-01-01  0.469112 -0.282863 -1.509059 -1.135632
2000-01-02  1.212112 -0.173215  0.119209 -1.044236
2000-01-03 -0.861849 -2.104569 -0.494929  1.071804
2000-01-04  0.721555 -0.706771 -1.039575  0.271860
2000-01-05 -0.424972  0.567020  0.276232 -1.087401
2000-01-06 -0.673690  0.113648 -1.478427  0.524988
2000-01-07  0.404705  0.577046 -1.715002 -1.039268
2000-01-08 -0.370647 -1.157892 -1.344312  0.844885

In [4]: panel = pd.Panel({'one' : df, 'two' : df - df.mean()})

In [5]: panel
Out[5]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 8 (major_axis) x 4 (minor_axis)
Items axis: one to two
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-08 00:00:00
Minor_axis axis: A to D

Примечание

Ни одна из функций индексирования не является специфичной для временных рядов, если не указано иное.

Таким образом, как и выше, у нас есть самое базовое индексирование с помощью []:

In [6]: s = df['A']

In [7]: s[dates[5]]
Out[7]: -0.67368970808837059

In [8]: panel['two']

© 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.22.0/indexing.html

Spec-Zone.ru

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