こんにちは,shun(@datasciencemore)です!!
記念すべきデータフレーム処理の1回目は,query:行の抽出についてです!
queryは,行を抽出するメソッドです.
条件を指定してあげると条件を満たした行を抽出してくれます.

queryは今までに何回か使ってきたので少しはなじみがあると思います.
このイメージ,とても大事ですので頭にこびりつけてくださいね
目次
1.queryの内部処理
filterは,実は
① 条件を判定し,行ごとに論理値ベクトル(True,False)を作成する.
② ①の論理値ベクトルをデータフレームに記録する.
③ ②でTrueであった行のみを抽出する.
ということを順番に内部でしています.

大丈夫,これも例をみればイメージがつかめるよ!
こちらがqueryの内部処理のイメージになります.

左上のデータフレームは,とある会社の従業員の性別(gender)と身長(height)を表すとしましょう.
この状態でqueryを適用するとします.
そうするとこのような流れで処理が実行されます.
① gender == "F"を判定し,行ごとに論理値ベクトル(TRUE,FALSE)を作成する.
② ①の論理値ベクトルをdfに記録する.
③ ②でTRUEとなった行のみを抽出する.
要するに,
条件を判定して,論理値ベクトルを作成し,その論理値ベクトルをもとに抽出される行が決定される!!
ということです.
条件を判定するには,numpyのベクトル処理でもやった比較演算子を使用します.
一番下のinだけ若干,numpyのときの違いますが,この使い方も結構するので慣れてください.

2.goodとbadの比較
行の抽出に関するgoodとbadを比較しましょう.

①と②は,同じ処理内容をgoodとbadでコーディングしたものになります.
まずgoodは今まで説明してきたとおり,queryを使用する方法です.
次にbadの紹介です.
badはデータフレームの中に直接論理値ベクトルを入れる方法です.
こちらのほうが一般的でよく説明される書き方だと思います.
データフレームの中に論理値ベクトルを入れるとTRUEに該当する行が抽出できるということは非常に大事です.
しかし,直接それを利用してコーディングすると,このbadのようになります.
この書き方だと,①のように条件が単純であればそれほど問題ではないですが,②のように条件が複雑になると,
・コードが長い.
・可読性が低い.
・名前が変わったときに修正が大変.
といったデメリットがあります.
なので,基本的に行の抽出をする際は,badの書き方ではなく,queryを使用するようにしましょう.
3.コーディング例
queryを使用して様々な条件で行を抽出しましょう!
今回は,diamondsデータを利用します.
0.準備
1 2 3 4 5 6 7 8 9 10 |
# パッケージ読み込み import pandas as pd import numpy as np import seaborn as sns # データフレームの表示行数を指定 pd.set_option('display.max_rows', 5) # データ読み込み df = sns.load_dataset("diamonds") |
一部,badの用法でも例示することがあります.
goodと比較して,どちらがいいか確認してみてください.
badの用法も重要です.
前述のとおり,goodとbadはあくまで僕の感想なので,どちらがいいか,最終的にはご自身で決めていただければと思います.
1.price列が337の行を抽出
1 2 3 4 5 |
# price列が337の行を抽出 df.query("price == 337") # bad df[df["price"] == 337] |

2.depth列が62以上の行を抽出
1 2 |
# depth列が62以上の行を抽出 df.query("depth >= 62") |

3.carat列が0.23~0.27の行を抽出
1 2 |
# carat列が0.23~0.27の行を抽出 df.query("0.23 <= carat <= 0.27") |

4.color列がEの行を抽出
文字列を指定する場合,'(シングルクオーテーション)で該当文字列を囲えばOKです.
1 2 |
# color列がEの行を抽出 df.query("color == 'E'") |

5.color列がE以外の行を抽出
1 2 |
# color列がE以外の行を抽出 df.query("color != 'E'") |

6.color列がIまたはJの行を抽出
1 2 |
# color列がIまたはJの行を抽出 df.query("color in ['I', 'J']") |

7.depth列が62以上かつcolor列がHの行を抽出(AND)
1 2 3 4 5 |
# depth列が62以上かつcolor列がHの行を抽出(AND) df.query("depth >= 62 & color == 'H'") # bad: depth列が62以上かつcolor列がHの行を抽出(AND) df[(df["depth"] >= 62) & (df["color"] == "H")] |

8.depth列が62以上またはcolor列がHの行を抽出(OR)
1 2 |
# depth列が62以上またはcolor列がHの行を抽出(OR) df.query("depth >= 62 | color == 'H'") |

9.(depth列が62以上かつcolor列がH)ではない行を抽出(NOT)
1 2 |
# (depth列が62以上かつcolor列がH)ではない行を抽出(NOT) df.query("~ (depth >= 62 & color == 'H')") |

10.price列が337の行を抽出 (変数を使用)
次のようにすると条件で使用する数値や文字列を変数で指定することが出来ます.
1 2 3 |
# price列が337の行を抽出 (変数を使用) x = 337 df.query("price == @x") |

まとめ
今回は,query:行の抽出について学習してきました.
行の抽出は,queryを使用する方法と論理値ベクトルをしてする方法がありますが,オススメはqueryになります.
queryを使用すると複雑な条件でも可読性が高く簡潔なコーディングをすることができます.
ぜひqueryを使いこなせるようになってください!
それでは,お疲れさまでした!!
次回
-
-
【pandas】filter:列の抽出【データフレーム処理】
こんにちは,shun(@datasciencemore)です!! 今回はfilterについて学習していきます. filterは,列を抽出するメソッドです. 条件を指定してあげると条件を満たした列を抽出 ...
続きを見る