目次
条件を付けて行を抽出する
queryメソッドは、Pandas.DataFrameの「任意の行を件を付けて抽出する」ことができます
Bool型と呼ばれる「True」と「False」に分かれる条件を設定し、「True」に当てはまる行を抽出します
- 数値○○以上に当てはまる行を抽出
- 文字列「○○」に当てはまる行を抽出
- 変数「○○」に当てはまる行を抽出
事前準備
Pandasというデータ解析を実施できるライブラリをインポートします
import pandas as pd
※サンプルデータ:学校のテストの点数
import pandas as pd
# 本サイトから直接データを取得
df = pd.read_html('https://smart-hint.com/student-data/')[0]
df.head()
queryの使い方
前提としてPythonのDataFramではqueryを利用せず下記コードで、条件を付けて抽出をすることができます
例として「サッカー部」の生徒を抽出します
df[df['club'] == 'サッカー'] #query()を使わない方法
この抽出方法では、変数名に[ ]を組み合わせて、比較演算子を用いて行を抽出します
ただこの書き方は非常に複雑で面倒です…
queryメソッドを使えば同様の条件を、非常にシンプルに記述することができます
()カッコの中に比較演算子の条件式を記載します
条件式はシングルクォート‘ ‘かダブルクォート” “で囲みましょう
df.query('club == "サッカー"')
同様の結果が抽出されました
記述する内容を減らすことができ、なおかつ可読性も上がるためぜひqueryメソッドを使ってみましょう
ここからは設定方法についてご紹介します
文字列を条件指定
上記の例のように文字列型である「部活」のカラムから「サッカー部」を抽出します
前述した通り、条件式はシングルクォート‘ ‘かダブルクォート” “で囲みます
条件式にシングルクォート‘ ‘を使う場合は、文字列にダブルクォート” “を使う
条件式にダブルクォート” “を使う場合は、文字列にシングルクォート‘ ‘を使う
「部活」がサッカー部の生徒を抽出します
df.query('club == "サッカー"')
文字列を条件指定(否定)
今度は「性別」が男性ではない生徒を抽出します
df.query('sex != "男性"')
queryメソッドでは、当てはまるという条件を「==」イコール2つで表現します
一方で否定の条件は「!=」ビックリマークとイコールで表現します
数値を条件抽出
数値型のデータに関しては「==」や「>」「<」で条件を指定します
「国語のテスト」で90点以上の生徒を抽出します
df.query('japanese>= 90')
数値を条件抽出(範囲)
また比較演算子を2つ使って範囲を指定することができます
「国語のテスト」で50点以上で60点未満の生徒を抽出します
df.query('60 > japanese >= 50')
複数の条件で抽出(AND条件)
queryの条件の中で「and」を使うことで、複数条件を組み合わせることができます
「国語・数学・英語」で全てで85点以上を取っている優等生を抽出します
df.query('japanese >= 85 and math >= 85 and english >= 85')
複数の条件で抽出(OR条件)
続いて「国語・数学・英語」のどれかで100点を取っている生徒を抽出します
queryの条件の中に「or」を使って条件をつなげます
df.query('japanese == 100 or math == 100 or english == 100')
「&」アンドの記号で「and」に代替することができ、「|」バーティカルバーで「or」と同じ意味を持ちます
df.query('japanese == 100 and math == 100 or english == 100')
df.query('japanese == 100 & math == 100 | english == 100')
複数の条件で抽出(文字列)
複数の文字列のどれかに当てはまるという条件は「or」で組み合わせても抽出できますが、
リスト型を使うとよりシンプルに記述することができます
「部活」が野球・サッカー・バスケに属している生徒を抽出します
df.query('club == ["野球","サッカー","バスケ"]')
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')
まとめ
今回は条件を付けて行を抽出するqueryについてご紹介してきました
非常によく使う機能なので、ぜひ覚えて使ってみてください