web-dev-qa-db-ja.com

Pandasクエリ関数は列名にスペースが含まれていません

列名にスペースを含むデータフレームがあります。 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を使用して角かっこ内に変数名を入れるハックが1つあります。[a b]

11
Bhushan Pant

From pandas 0.25以降、バッククォートで列名をエスケープできるので、

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

パンダ0.25+

説明したとおり here

DataFrame.query()およびDataFrame.eval()は、スペースを含む名前を参照するために、列名を引用符で囲むことをサポートするようになりました( GH6508

以下を使用できます。

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

パンダ0.25以前

列名に空白が含まれている場合、pd.DataFrame.queryは使用できません。 abおよびa bという名前の列がある場合にどうなるかを考えてください。必要なものに関してあいまいさがあります。

代わりに、pd.DataFrame.locを使用できます。

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

行のみをフィルタリングしているため、.locアクセサーを完全に省略することができます。

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

まだ不可能です。チェック github issue#6508

実際には。queryは単なる便利なインターフェイスであり、実際には非常に具体的な保証があり、クエリのように解析することを意味することに注意してください言語であり、完全に一般的なインターフェースではありません。

理由は、queryが有効なpython式である必要があるため、列名は有効なpython識別子でなければなりません。

解決策は boolean indexing

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

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]

出力:

3    5

インデックス3で条件がTrueと評価されることがわかります(一連のブール値ではなく特定のインデックスが必要な場合)。

0
Simeon Ikudabo

クエリメソッドが空のスペースを持つ列名を受け入れないことを恐れています。いずれの場合でも、次の方法でデータフレームを照会できます。

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