Сообщить об ошибке.

Метод DataFrame.query() модуля pandas в Python

Отбор столбцов DataFrame с помощью логического выражения

Синтаксис:

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