Spec-Zone.ru › pandas 0.24

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

Информация о метках осей в объектах 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.24.2/user_guide/indexing.html

Spec-Zone.ru

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