この記事について
pandasで使うデータフレームはいろいろな方法でデータを整理することができますが、なんとなく使ってるquery()メソッドはよくみたら指定できる引数があったので確認しておきます。
記事の対象者
pandasのquery()について基礎的な知識をさらーっと見たい方。
pandasのデータフレームは下のものを例にして以降の説明していきます。
import pandas as pd
data = {'name': ['田中', '鈴木', '佐藤', '高橋', '安藤'],
'age': [25, 32, 28, 19, 50],
'address': ['東京都', '大阪府', '福岡県', '北海道', '東京都']}
# データフレームを作成
df = pd.DataFrame(data)
print(df)
df
# name age address
# 0 田中 25 東京都
# 1 鈴木 32 大阪府
# 2 佐藤 28 福岡県
# 3 高橋 19 北海道
# 4 安藤 50 東京都
query()ってなに
データフレームに対して条件文を記載することで、指定するデータを抽出するメソッドです。
条件式の書き方
例えば上で書いたデータに対して、"age"が30未満のデータを取得したい場合には下のように書くことができます。
df.query('age < 30')
# name age address
# 0 田中 25 東京都
# 2 佐藤 28 福岡県
# 3 高橋 19 北海道
ちなみに書き方としてはquery()を使わないで
df[df['age'] < 30]
と書いても結果は同じです。
変数の参照
queryメソッド内では変数を指定することができます。
上の例でageが30未満としてましたが、borderという変数を導入してみます。
# 変数を指定
border = 30
# @変数名 でqueryメソッド内で参照
df.query('age < @border')
# name age address
# 0 田中 25 東京都
# 2 佐藤 28 福岡県
# 3 高橋 19 北海道
文字列の指定
queryメソッド内で文字列を入れたい時にはダブルクオーテーションで囲みます。
# addressが"県"の文字で終わるデータを抽出
df.query('address.str.endswith("県")')
# name age address
# 2 佐藤 28 福岡県
複数条件の追加
and, orで条件文を追加できます。
# addressが東京都 かつ ageが40より大きい
df.query('address == "東京都" and age > 40')
# name age address
# 4 安藤 50 東京都
# addressが東京都 または ageが30より大きい
df.query('address == "東京都" or age > 30')
# name age address
# 0 田中 25 東京都
# 1 鈴木 32 大阪府
# 4 安藤 50 東京都
よくわかってないこと。
parser
queryで条件を指定するときキーワード引数parserで指定されていて、デフォルトだとpandasのパーサーを使うことになります。
engine
勉強してるとengine='python'というキーワード引数が設定されているものがある。
これはデフォルトでは(インストールされていれば)numexprという値が指定されていて推奨はこちららしいです。
文字列メソッドを使う場合はpythonを指定する必要があるというのを読んだが、numexprを指定しても動いてる気がする。。
勉強中です。