query()
メソッドを使って複数の条件を組み合わせる書き方を学びます。
Name | Height | Weight | |
---|---|---|---|
0 | 佐藤 | 172 | 53 |
1 | 田中 | 160 | 50 |
2 | 鈴木 | 165 | 58 |
3 | 長谷川 | 160 | 65 |
「Weightが55以上、かつ、Heightが160以下」の行は以下のように取得できました。
df[(df.Weight >= 55) & (df.Height <= 160)]
Name | Height | Weight | |
---|---|---|---|
3 | 長谷川 | 160 | 65 |
これは、query()
メソッドを使って下記のように記述できます。
df.query("Weight >= 55 & Height <= 160")
query()
の第1引数に条件を表す文字列(クエリといいます)を指定します。
クエリはPythonのコードのように書けますが、主に下記の点が異なります。
- 列名を変数のように書くことで、列として扱えます(例:
Weight >= 55
)。 - もし、列名中に変数として使えない文字(空白など)があれば、列名をバッククォートでくくります(例:
`Weight kg` >= 55
)。 - 通常の変数は頭に
@
をつけます(threshold = 55
のときの例:Weight >= @threshold
)。 &
と|
の優先順位は、and
とor
と同じになっています。そのため、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
Name | Height | Weight | |
---|---|---|---|
0 | 佐藤 | 172 | 53 |
1 | 田中 | 160 | 50 |
2 | 鈴木 | 165 | 58 |
3 | 長谷川 | 160 | 65 |
「Weightが55以上、かつ、Heightが160以下」で行を絞り込んで取得します。列名はそのまま記述します。「かつ」は「&」で記述できます
df_sub = df.query("Weight >= 55 & Height <= 160")
df_sub
1.df[]と書く必要はない。
2.条件の部分で“Weight”と文字列と指定する必要がない。
3.表記の方法が直接的に分かるようになっている
4.query(“条件”)と記載する
Name | Height | Weight | |
---|---|---|---|
3 | 長谷川 | 160 | 65 |
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)
)だけです。
コメント