Функция запроса Pandas не работает с пробелами в именах столбцов - PullRequest
0 голосов
/ 05 июня 2018

У меня есть датафрейм с пробелами в именах столбцов.Я пытаюсь использовать метод query, чтобы получить результаты.Он работает нормально со столбцом 'c', но получает ошибку для 'a b'

import pandas as pd
a = pd.DataFrame(columns=["a b", "c"])
a["a b"] = [1,2,3,4]
a["c"] = [5,6,7,8]
a.query('a b==5')

. Для этого я получаю эту ошибку:

a b ==5
  ^
SyntaxError: invalid syntax

Я не хочу заполнятьпробел с другими символами, такими как '_' и т. д.

Существует один хак, использующий pandasql для помещения имени переменной в скобки, например: [ab]

Ответы [ 5 ]

0 голосов
/ 16 мая 2019

Начиная с панд 0.25 и далее, вы сможете экранировать имена столбцов с помощью обратных кавычек, чтобы вы могли

a.query('`a b` == 5') 
0 голосов
/ 05 июня 2018

Боюсь, что метод запроса не принимает имя столбца с пустым пространством.В любом случае вы можете запросить фрейм данных следующим образом:

import pandas as pd
a = pd.DataFrame({'a b':[1,2,3,4], 'c':[5,6,7,8]})
a[a['a b']==1]
0 голосов
/ 05 июня 2018

Это пока невозможно.Проверьте GitHub номер # 6508 :

Обратите внимание, что на самом деле .query это просто приятный интерфейс, на самом деле он имеет очень конкретные гарантииЭто означает, что он предназначен для синтаксического анализа, как язык запросов, а не как полностью общий интерфейс.

Причина в том, что query нужно, чтобы строка была допустимым выражением Python, поэтому имена столбцов должны быть действительными идентификаторами Python,

Решение boolean indexing:

df = df[df['a b'] == 5]
0 голосов
/ 05 июня 2018

Вместо использования функции pandas.query в этом случае я бы создал условие для поиска значений и где условие имеет значение True.Например:

import pandas as pd
a = pd.DataFrame(columns=["a b", "c"])
a["a b"] = [1,2,3,5]
a["c"] = [5,6,7,8]
#a.query('a b==5') Remove the query because it cannot lookup columns with spaces in the name.

condition = a['a b'] == 5
print(a['a b'][condition]

output:

3    5

Мы видим, что в индексе 3 ваше условие оценивается как True (если вы хотите определенный индекс, а не ряд логических значений).

0 голосов
/ 05 июня 2018

Панды 0,25 +

Как описано здесь :

DataFrame.query() и DataFrame.eval() теперь поддерживает цитирование имен столбцов с помощью обратных кавычек для ссылки на имена спробелы ( GH6508 )

Таким образом, вы можете использовать:

a.query('`a b`==5')

Pandas pre-0.25

Вы не можете использовать pd.DataFrame.query, еслиу вас есть пробел в названии вашего столбца.Подумайте, что произойдет, если у вас есть столбцы с именами a, b и a b;может возникнуть неоднозначность относительно того, что вам нужно.

Вместо этого вы можете использовать pd.DataFrame.loc:

df = df.loc[df['a b'] == 5]

Поскольку вы фильтруете только строки, вы можете вообще опустить .loc:

df = df[df['a b'] == 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...