( New ) 新連載スタート!2人の会話形式でPythonを学ぶ「週末Pythonゆる講座」はこちら ▶▶

【Python】query|条件を付けて行を抽出する

条件を付けて行を抽出する

queryメソッドは、Pandas.DataFrameの「任意の行を件を付けて抽出する」ことができます

Bool型と呼ばれる「True」と「False」に分かれる条件を設定し、「True」に当てはまる行を抽出します

  • 数値○○以上に当てはまる行を抽出
  • 文字列「○○」に当てはまる行を抽出
  • 変数「○○」に当てはまる行を抽出
Pythonのqueryメソッドのイメージ

事前準備

Pandasというデータ解析を実施できるライブラリをインポートします 

import pandas as pd

※サンプルデータ:学校のテストの点数

学校のイメージ
import pandas as pd
# 本サイトから直接データを取得
df = pd.read_html('https://smart-hint.com/student-data/')[0]
df.head()
Python学習のための学校のテストのサンプルデータ

queryの使い方

前提としてPythonのDataFramではqueryを利用せず下記コードで、条件を付けて抽出をすることができます

例として「サッカー部」の生徒を抽出します

df[df['club'] == 'サッカー'] #query()を使わない方法
Pythonのqueryメソッドのイメージ

この抽出方法では、変数名に[ ]を組み合わせて、比較演算子を用いて行を抽出します

ただこの書き方は非常に複雑で面倒です…


queryメソッドを使えば同様の条件を、非常にシンプルに記述することができます

()カッコの中に比較演算子の条件式を記載します

条件式はシングルクォート‘ ‘かダブルクォート” “で囲みましょう

df.query('club == "サッカー"')
Pythonのqueryメソッドで条件抽出するイメージ

同様の結果が抽出されました

記述する内容を減らすことができ、なおかつ可読性も上がるためぜひqueryメソッドを使ってみましょう

ここからは設定方法についてご紹介します

文字列を条件指定

上記の例のように文字列型である「部活」のカラムから「サッカー部」を抽出します

前述した通り、条件式はシングルクォート‘ ‘ダブルクォート” “で囲みます

条件式にシングルクォート‘ ‘を使う場合は、文字列にダブルクォート” “を使う

条件式にダブルクォート” “を使う場合は、文字列にシングルクォート‘ ‘を使う

「部活」がサッカー部の生徒を抽出します

df.query('club == "サッカー"')
Pythonのqueryメソッドで文字列を条件指定する方法

文字列を条件指定(否定)

今度は「性別」が男性ではない生徒を抽出します

df.query('sex != "男性"')
Pythonのqueryメソッドで文字列の否定をする
普段使わない==イコールの使い方

queryメソッドでは、当てはまるという条件を「==」イコール2つで表現します

一方で否定の条件は「!=」ビックリマークとイコールで表現します

数値を条件抽出

数値型のデータに関しては「==」や「>」「<」で条件を指定します

「国語のテスト」で90点以上の生徒を抽出します

df.query('japanese>= 90')
Pythonのqueryメソッドで数値を条件抽出する

数値を条件抽出(範囲)

また比較演算子を2つ使って範囲を指定することができます

「国語のテスト」で50点以上で60点未満の生徒を抽出します

df.query('60 > japanese >= 50')
Pythonのqueryメソッドで数値を条件抽出する方法

複数の条件で抽出(AND条件)

queryの条件の中で「and」を使うことで、複数条件を組み合わせることができます

「国語・数学・英語」で全てで85点以上を取っている優等生を抽出します

df.query('japanese >= 85 and math >= 85 and english >= 85')
Pythonのqueryメソッドで複数の条件で抽出する方法(AND)

複数の条件で抽出(OR条件)

続いて「国語・数学・英語」のどれかで100点を取っている生徒を抽出します

queryの条件の中に「or」を使って条件をつなげます

df.query('japanese == 100 or math == 100 or english == 100')
Pythonのqueryメソッドで複数の条件で抽出する方法
「and」と「or」の代替

「&」アンドの記号で「and」に代替することができ、「|」バーティカルバーで「or」と同じ意味を持ちます

df.query('japanese == 100 and math == 100 or english == 100')
df.query('japanese == 100 & math == 100 | english == 100')

複数の条件で抽出(文字列)

複数の文字列のどれかに当てはまるという条件は「or」で組み合わせても抽出できますが、

リスト型を使うとよりシンプルに記述することができます

「部活」が野球・サッカー・バスケに属している生徒を抽出します

df.query('club == ["野球","サッカー","バスケ"]')
Pythonのqueryメソッドで複数の条件で抽出する方法
df.query('club in ["野球","サッカー","バスケ"]')
df.query('club == "野球" or club == "サッカー" or club == "バスケ"')

変数を条件式に使う

別で用意した変数をqueryの条件に利用することができます

変数の前に「@」アットマークを付ける必要があるため、ご注意してください

例として数学のテストの平均点以上の生徒を抽出します

まずテストの平均点を「math_average」として変数に代入します

math_average = df['math'].mean()

そして変数「math_average」の頭に「@」を付けて、query()メソッドを使います

df.query('math > @math_average')
Pythonのqueryメソッドで変数を使う方法

まとめ

今回は条件を付けて行を抽出するqueryについてご紹介してきました

非常によく使う機能なので、ぜひ覚えて使ってみてください

お気に入り登録お願いします

コメントを残す

メールアドレスが公開されることはありません。