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