Индексирование и выбор данных
Информация об обозначении осей в объектах 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