こんにちは,shun(@datasciencemore)です!!
記念すべきデータフレーム処理の1回目は,filter:行の抽出についてです!
filterは,行を抽出するメソッドです.
条件を指定してあげると条件を満たした行を抽出してくれます.
filterは今までに何回か使ってきたので少しはなじみがあると思います.
このイメージ,とても大事ですので頭にこびりつけてくださいね
目次
1.filterの内部処理
filterは,実は
① 条件を判定し,行ごとに論理値ベクトル(True,False)を作成する.
② ①の論理値ベクトルをデータフレームに記録する.
③ ②でTrueであった行のみを抽出する.
ということを順番に内部でしています.
大丈夫,これも例をみればイメージがつかめるよ!
こちらがqueryの内部処理のイメージになります.
左上のデータフレームは,とある会社の従業員の性別(gender)と身長(height)を表すとしましょう.
この状態でfilterを適用するとします.
そうするとこのような流れで処理が実行されます.
① gender == "F"を判定し,行ごとに論理値ベクトル(TRUE,FALSE)を作成する.
② ①の論理値ベクトルをdfに記録する.
③ ②でTRUEとなった行のみを抽出する.
要するに,
条件を判定して,論理値ベクトルを作成し,その論理値ベクトルをもとに抽出される行が決定される!!
ということです.
条件を判定するには,numpyのベクトル処理でもやった比較演算子を使用します.
is_betweenとis_inだけ若干,numpyのときの違いますが,この使い方も結構するので慣れてください.
2.コーディング例
filterを使用して様々な条件で行を抽出しましょう!
今回は,diamondsデータを利用します.
0.準備
1 2 3 4 5 6 7 8 9 10 |
# パッケージ読み込み import numpy as np import polars as pl import seaborn as sns # データフレームの表示行数を指定 pl.Config.set_tbl_rows(5) # データ読み込み df = pl.from_pandas(sns.load_dataset("diamonds")) |
一部,badの用法でも例示することがあります.
goodと比較して,どちらがいいか確認してみてください.
badの用法も重要です.
前述のとおり,goodとbadはあくまで僕の感想なので,どちらがいいか,最終的にはご自身で決めていただければと思います.
1.price列が337の行を抽出
1 2 |
# price列が337の行を抽出 df.filter(pl.col("price") == 337) |
2.depth列が62以上の行を抽出
1 2 |
# depth列が62以上の行を抽出 df.filter(pl.col("depth") >= 62) |
3.carat列が0.23~0.27の行を抽出
1 2 |
# carat列が0.23~0.27の行を抽出 df.filter(pl.col("carat").is_between(0.23, 0.27)) |
4.color列がEの行を抽出
1 2 |
# color列がEの行を抽出 df.filter(pl.col("color") == "E") |
5.color列がE以外の行を抽出
1 2 |
# color列がE以外の行を抽出 df.filter(pl.col("color") != "E") |
6.color列がIまたはJの行を抽出
1 2 |
# color列がIまたはJの行を抽出 (エラーが出る場合は、カテゴリ型をstr型に変換) df.filter(pl.col("color").cast(pl.Utf8).is_in(["I", "J"])) |
7.depth列が62以上かつcolor列がHの行を抽出(AND)
1 2 |
# depth列が62以上かつcolor列がHの行を抽出(AND) df.filter((pl.col("depth") >= 62) & (pl.col("color") == "H")) |
8.depth列が62以上またはcolor列がHの行を抽出(OR)
1 2 |
# depth列が62以上またはcolor列がHの行を抽出(OR) df.filter((pl.col("depth") >= 62) | (pl.col("color") == "H")) |
9.(depth列が62以上かつcolor列がH)ではない行を抽出(NOT)
1 2 |
# (depth列が62以上かつcolor列がH)ではない行を抽出(NOT) df.filter(~((pl.col("depth") >= 62) & (pl.col("color") == "H"))) |
10.price列が337の行を抽出 (変数を使用)
1 2 3 |
# price列が337の行を抽出 (変数を使用) x = 337 df.filter(pl.col("price") == x) |
まとめ
今回は,filter:行の抽出について学習してきました.
filterを使用すると複雑な条件でも可読性が高く簡潔なコーディングをすることができます.
ぜひfilterを使いこなせるようになってください!
それでは,お疲れさまでした!!