DataFrame.query(expr, *, inplace=False, **kwargs)
expr
- строка запроса. Можно ссылаться на переменные в сценарии, добавляя к ним префикс с символом @
, например @a + b
.
Можно ссылаться на имена столбцов, которые не являются допустимыми именами переменных Python, окружая их обратными кавычками. Таким образом, имена столбцов, содержащие пробелы или знаки препинания (помимо подчеркивания) или начинающиеся с цифр, должны быть заключены в обратные кавычки. Например, на столбец с именем:
'Area (cm^2)'
необходимо ссылаться как:
`Area (cm^2)`
Имена столбцов, которые являются ключевыми словами Python (например, list
, for
, import
и т.д.), использовать нельзя.
Например, если один из столбцов называется a a
и необходимо просуммировать его с b
, то запрос должен быть:
`a a` + b
inplace
- следует ли изменять DataFrame
вместо создания нового. Принимает значение bool
.
**kwargs
- ключевые аргументы передаваемые в функцию eval()
.
Переменные в обратных кавычках анализируются как буквальный код Python функцией
eval()
и внутренне преобразуются в действительный идентификатор Python. Это может привести к некоторым проблемам.
DataFrame
, полученный в результате предоставленного выражения запроса, или None
, если inplace=True
.Метод DataFrame.query()
библиотеки pandas
запрашивает столбцы DataFrame
с помощью логического выражения expr
. Этот метод использует функцию верхнего уровня eval()
для оценки переданного запроса expr
.
По умолчанию DataFrame.query()
использует слегка измененный синтаксис Python. Например, &
и |
(побитовые) операторы имеют приоритет своих логических собратьев and
и or
. Это синтаксически правильный Python, но семантика другая.
Можно изменить семантику выражения, передав ключевой аргумент parser='python'
(**kwargs
). Это обеспечивает ту же семантику, что и оценка логических операторов в пространстве Python. Аналогичным образом можно передать engine='python'
для вычисления выражения, используя сам Python в качестве бaкэнда. Это не рекомендуется, т.к. это неэффективно по сравнению с использованием numexpr
в качестве движка.
Атрибуты DataFrame.index
и DataFrame.columns
по умолчанию помещаются в пространство имен запроса, что позволяет обрабатывать как индекс, так и столбцы как столбец в кадре. Идентификатор index
используется для индекса кадра. Также можно использовать строковое имя индекса для его идентификации в запросе. Обратите внимание, что ключевые слова Python не могут использоваться в качестве идентификаторов.
Пример использования обратных кавычек:
Для столбцов с пробелами в названии нужно использовать обратные кавычки.
df.query('B == `C C`')
выражение эквивалентно:
df[df.B == df['C C']]
DataFrame.query()
:>>> import pandas as pd >>> df = pd.DataFrame({'A': range(1, 6), ... 'B': range(10, 0, -2), ... 'C C': range(10, 5, -1)}) >>> df # A B C C # 0 1 10 10 # 1 2 8 9 # 2 3 6 8 # 3 4 4 7 # 4 5 2 6 >>> df.query('A > B') # A B C C # 4 5 2 6
Предыдущее выражение эквивалентно:
>>> df[df.A > df.B] # A B C C # 4 5 2 6
Для столбцов с пробелами в названии можно использовать обратные кавычки.
>>> df.query('B == `C C`') # A B C C # 0 1 10 10
Предыдущее выражение эквивалентно:
>>> df[df.B == df['C C']] # A B C C # 0 1 10 10
Внутри запроса можно использовать переменные Pyrthon, добавляя к ним префикс с символом @
:
>>> flag = 3 >>> df.query('B > `C C` - @flag') # A B C C # 0 1 10 10 # 1 2 8 9 # 2 3 6 8
Можно получить значение DataFrame
, где столбец B
имеет значения между значениями столбцов A
и C C
. Например:
>>> df.query('(A < B) and (B < `C C`)') # A B C C # 1 2 8 9 # 2 3 6 8 # или использовав символ `&` вместо `and` >>> df.query('(A < B) & (B < `C C`)') # A B C C # 1 2 8 9 # 2 3 6 8 # или просто >>> df.query('A < B < `C C`') # A B C C # 1 2 8 9 # 2 3 6 8
Можно сравнивать значения столбцов со значениями своего индекса, использовав имя index
в выражении запроса:
>>> df.query('index * 2 > A + 1') # A B C C # 3 4 4 7 # 4 5 2 6 >>> df.query('index < 2') # A B C C # 0 1 10 10 # 1 2 8 9