Spec-Zone.ru › pandas 0.23

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

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

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

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

Примечание

Операторы индексирования 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) — выделение срезов меньшей размерности. В следующей таблице показаны значения типов возвращаемых данных при индексировании объектов pandas с использованием []:

Тип объекта Выбор Тип возвращаемого значения
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.23.4/indexing.html

Spec-Zone.ru

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