queryメソッドを使って条件を組み合わせる

query()メソッドを使って複数の条件を組み合わせる書き方を学びます。


Name
HeightWeight
0佐藤17253
1田中16050
2鈴木16558
3長谷川16065

「Weightが55以上、かつ、Heightが160以下」の行は以下のように取得できました。

df[(df.Weight >= 55) & (df.Height <= 160)]
NameHeightWeight
3長谷川16065

これは、query()メソッドを使って下記のように記述できます。

df.query("Weight >= 55 & Height <= 160")

query()第1引数に条件を表す文字列(クエリといいます)を指定します。

クエリはPythonのコードのように書けますが、主に下記の点が異なります。

  • 列名を変数のように書くことで、列として扱えます(例:Weight >= 55)。
  • もし、列名中に変数として使えない文字(空白など)があれば、列名をバッククォートでくくります(例:`Weight kg` >= 55)。
  • 通常の変数は頭に@をつけます(threshold = 55のときの例:Weight >= @threshold)。
  • &|の優先順位は、andorと同じになっています。そのため、Weight >= 55などの条件式に括弧を付ける必要はありません

なお、query()の範囲を新しい値で更新することはできません
たとえば、df.query(クエリ) = 新しい値のような記述はSyntaxErrorになります。

演習

「Weightが55以上、かつ、Heightが160以下」を取得して変数df_subに入れてみましょう。

import pandas as pd
df = pd.read_csv("dataset/health_check.csv", encoding="utf-8")
df
NameHeightWeight
0佐藤17253
1田中16050
2鈴木16558
3長谷川16065

「Weightが55以上、かつ、Heightが160以下」で行を絞り込んで取得します。列名はそのまま記述します。「かつ」は「&」で記述できます

df_sub = df.query("Weight >= 55 & Height <= 160")
df_sub

1.df[]と書く必要はない。
2.条件の部分で“Weight”と文字列と指定する必要がない
3.表記の方法が直接的に分かるようになっている
4.query(“条件”)と記載する

NameHeightWeight
3長谷川16065

query()でできることは、query()を使わずに書けます。

列名は、バッククォートでくくれます。下記を実行して、結果が変わらないことを確認しましょう。

df.query("`Weight` >= 55 & `Height` <= 160")

変数には@をつけます。下記を実行して、結果が変わらないことを確認しましょう。

th1 = 55
th2 = 160
df.query("Weight >= @th1 & Height <= @th2")

query()では、以下のように主に2通りの書き方ができます。

  • 論理積:条件1 & 条件2または条件1 and 条件2
  • 論理和:条件1 | 条件2または条件1 or 条件2
  • 否定:~(条件)またはnot 条件

しかし、排他的論理和ではビット演算子(条件1 ^ 条件2)は使えません。使えるのは比較演算子((条件1) != (条件2))だけです。

コメント

タイトルとURLをコピーしました