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]
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]
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]
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).
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]