Индексирование и выбор данных
Информация об этикетках осей в объектах pandas служит для многих целей:
- Определяет данные (т. е. предоставляет метаданные) с использованием известных индикаторов, важных для анализа, визуализации и интерактивного отображения в консоли
- Обеспечивает автоматическое и явное выравнивание данных
- Позволяет интуитивно получать и устанавливать подмножества набора данных
В этом разделе мы сосредоточимся на последнем пункте: как резать, нарезать и в целом получать и устанавливать подмножества объектов pandas. Основное внимание будет уделено Series и DataFrame, поскольку в этой области им уделено больше внимания в разработке. В будущем ожидается больше работы над многомерными структурами данных (включая Panel), особенно в области расширенного индексирования на основе меток.
Примечание
Операторы индексирования Python и NumPy [] и оператор атрибута . обеспечивают быстрый и простой доступ к структурам данных pandas в широком диапазоне случаев использования. Это делает интерактивную работу интуитивной, так как вам почти ничего не нужно изучать, если вы уже знаете, как работать со словарями Python и массивами NumPy. Однако, так как тип данных, к которому нужно получить доступ, не известен заранее, непосредственное использование стандартных операторов имеет некоторые ограничения по оптимизации. Для кода в производстве мы рекомендуем использовать оптимизированные методы доступа к данным pandas, описанные в этой главе.
Предупреждение
Возврат копии или ссылки при операции установки может зависеть от контекста. Это иногда называется chained assignment и следует избегать. См. Возврат представления вместо копии
Предупреждение
В версии 0.15.0 Index внутренне был переработан, чтобы больше не наследовать от ndarray, а вместо этого наследовать от PandasObject, подобно остальным объектам pandas. Это должно быть прозрачное изменение с очень ограниченными последствиями для API (см. Внутренняя рефакторизация)
Предупреждение
Индексирование по целочисленному индексу с плавающей точкой было уточнено в версии 0.18.0. Для обзора изменений см. здесь.
См. MultiIndex/Расширенное индексирование для MultiIndex и более расширенной документации по индексированию.
См. справочник для некоторых расширенных стратегий
Разные варианты индексирования
Новое в версии 0.11.0.
Для поддержки более явного индексирования на основе местоположения в выборке объектов были внесены многочисленные изменения по запросам пользователей. 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) заключается в выборе подмножеств меньшей размерности. Таким образом,
| Тип объекта | Выбор | Тип возвращаемого значения |
|---|---|---|
| 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.20.3/indexing.html