web-dev-qa-db-fra.com

La fonction de requête des pandas ne fonctionne pas avec des espaces dans les noms de colonnes

J'ai un dataframe avec des espaces dans les noms de colonne. J'essaie d'utiliser la méthode query pour obtenir les résultats. Cela fonctionne bien avec la colonne 'c' mais en obtenant une erreur pour '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')

Pour cela, je reçois cette erreur:

a b ==5
  ^
SyntaxError: invalid syntax

Je ne veux pas remplir tout l'espace avec d'autres personnages comme '_' etc. 

Il y a un hack qui utilise pandasql pour mettre le nom de la variable entre crochets, par exemple: [a b]

6
Bhushan Pant

Vous ne pouvez pas utiliser pd.DataFrame.query si le nom de votre colonne contient des espaces. Réfléchissez à ce qui arriverait si vous aviez des colonnes nommées a, b et a b; il y aurait une ambiguïté quant à ce dont vous avez besoin.

Au lieu de cela, vous pouvez utiliser pd.DataFrame.loc:

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

Puisque vous ne filtrez que les lignes, vous pouvez omettre complètement l’accesseur .loc:

df = df[df['a b'] == 5]
6
jpp

Ce n'est pas encore possible. Vérifier numéro de github # 6508 :

Notez qu'en réalité, .query n'est qu'une interface agréable à utiliser. En fait, il présente des garanties très spécifiques, ce qui signifie qu'il doit être analysé comme un langage de requête et non comme une interface totalement générale.

La raison pour laquelle query need string est une expression python valide; les noms de colonne doivent donc être des identificateurs python valides. 

La solution est boolean indexing :

df = df[df['a b'] == 5]
1
jezrael

Au lieu d'utiliser la fonction pandas.query, je créerais une condition dans ce cas pour rechercher des valeurs et où la condition est True. Par exemple:

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]

sortie:

3    5

Nous voyons qu'à l'index 3, votre condition est évaluée à True (si vous voulez l'index spécifique et non les valeurs Series of Boolean). 

0
Simeon Ikudabo

Je crains que la méthode de requête n'accepte pas le nom de colonne avec un espace vide. Dans tous les cas, vous pouvez interroger le dataframe de cette façon:

import pandas as pd
a = pd.DataFrame({'a b':[1,2,3,4], 'c':[5,6,7,8]})
a[a['a b']==1]
0
DTT