Spec-Zone.ru › pandas 0.25

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

Информация об обозначении осей в объектах 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) и возвращающая допустимый результат для индексирования (один из вышеперечисленных).

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

    Дополнительную информацию см. в разделе Выбор по метке.

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

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

      Введено в версии 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]

Основы

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

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

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

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]: s = df['A']

In [5]: s[dates[5]]
Out[5]: -0.6736897080883706

Вы можете передать список столбцов в [], чтобы выбрать столбцы в этом порядке. Если столбец не содержится в DataFrame, будет возбуждено исключение. Несколько столбцов также могут быть установлены таким образом:

In [6]: df
Out[6]: 
                   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 [7]: df[['B', 'A']] = df[['A', 'B']]

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

Это может быть полезно для применения преобразования (на месте) к подмножеству столбцов.

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

pandas выравнивает все ОСИ при установке Series и DataFrame из .loc и .iloc.

Это не изменит df, потому что выравнивание столбцов выполняется до присваивания значений.

In [9]: df[['A', 'B']]
Out[9]: 
                   A         B
2000-01-01 -0.282863  0.469112
2000-01-02 -0.173215  1.212112
2000-01-03 -2.104569 -0.861849
2000-01-04 -0.706771  0.721555
2000-01-05  0.567020 -0.424972
2000-01-06  0.113648 -0.673690
2000-01-07  0.577046  0.404705
2000-01-08 -1.157892 -0.370647

In [10]: df.loc[:, ['B', 'A']] = df[['A', 'B']]

In [11]: df[['A', 'B']]
Out[11]: 
                   A         B
2000-01-01 -0.282863  0.469112
2000-01-02 -0.173215  1.212112
2000-01-03 -2.104569 -0.861849
2000-01-04 -0.706771  0.721555
2000-01-05  0.567020 -0.424972
2000-01-06  0.113648 -0.673690
2000-01-07  0.577046  0.404705
2000-01-08 -1.157892 -0.370647

Правильный способ обмена значениями столбцов — использование исходных значений:

In [12]: df.loc[:, ['B', 'A']] = df[['A', 'B']].to_numpy()

In [13]: df[['A', 'B']]
Out[13]: 
                   A         B
2000-01-01  0.469112 -0.282863
2000-01-02  1.212112 -0.173215
2000-01-03 -0.861849 -2.104569
2000-01-04  0.721555 -0.706771
2000-01-05 -0.424972  0.567020
2000-01-06 -0.673690  0.113648
2000-01-07  0.404705  0.577046
2000-01-08 -0.370647 -1.157892

Доступ к атрибутам

Вы можете получить доступ к индексу Series или столбцу DataFrame напрямую как к атрибуту:

In [14]: sa = pd.Series([1, 2, 3], index=list('abc'))

In [15]: dfa = df.copy()
In [16]: sa.b
Out[16]: 2

In [17]: dfa.A

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

Spec-Zone.ru

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