Spec-Zone.ru › pandas 0.21

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

Информация об именовании осей в объектах 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 если запрашиваемый индексатор находится вне границ, за исключением индексаторов slice, которые допускают индексирование вне границ. (это соответствует семантике срезов 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.21.1/indexing.html

Spec-Zone.ru

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