特定のデータだけを狙い撃ち!numpyのフィルタリングをマスターしよう

こんにちは。ゆうせいです。

前回は、包丁で切り出すようにデータの範囲を指定するスライスについてお話ししましたね。でも、実際のデータ分析では「 3 行目から 5 行目」といった場所による指定だけでなく、「テストで 80 点以上の人だけ」とか「マイナスのデータだけ」というように、中身の条件でデータを選びたい場面が圧倒的に多いのです。

そんなときに活躍するのが、今回解説する フィルタ(フィルタリング) です。

皆さんは、砂場から宝物を探すとき、大きな「ふるい」を使ったことはありませんか。条件に合うものだけを残し、それ以外を落としてしまう。プログラミングのフィルタリングも、まさにあの「ふるい」と同じ役割を果たしてくれます!

フィルタリングの正体は「YesかNoか」

numpyでフィルタリングを行うとき、裏側では ブールインデックス参照 という仕組みが動いています。

少し難しい名前に聞こえますが、中身はシンプルです。配列の要素一つひとつに対して、「条件に合っていますか?」と問いかけ、 $True$ (はい)か $False$ (いいえ)という結果のリストを作っているだけなのです。

例えば、 [10, 20, 30] というデータに対して、「 15 より大きいか」というフィルタをかけると、次のような Yes/No のリストが作られます。

$False, True, True$

この $True$ の場所にある数字だけを拾い上げるのが、フィルタリングの正体です。

比較演算子で「ふるい」を作る

フィルタの条件を作るには、数学でもおなじみの比較演算子を使います。

  • > (より大きい)
  • < (より小さい)
  • >= (以上)
  • <= (以下)
  • == (等しい)

高校生の皆さんが数学の授業で使う記号とほとんど同じですね!

例えば、配列 data の中から 0 未満の数字だけを取り出したいときは、次のように書きます。

結果 = data $[$ data < 0 $]$

カッコの中に条件式をそのまま放り込むだけでいいなんて、とっても直感的だと思いませんか。

フィルタリングのメリットとデメリット

この機能を使いこなすと、データ処理の効率が劇的に変わります。

メリット

  1. 複雑な条件も一発: if文を何回も書かなくても、一行で欲しいデータが手に入ります。
  2. データの修正が楽: 「 0 未満のデータをすべて 0 に書き換える」といった操作も、フィルタを使えば一瞬です。

デメリット(注意点)

複数の条件を組み合わせるとき(例えば「 50 以上 かつ 80 以下」など)は、Python標準の andor が使えません。

代わりに、 & (かつ)や | (または)という記号を使い、それぞれの条件をカッコ () で囲む必要があります。ここだけは、書き方のルールとしてしっかり覚えておきましょう!

フィルタリングの書き方まとめ

よく使う条件の組み合わせ方を表にしました。

やりたいこと書き方のイメージ
ある数字より大きいものdata $[$ data > 100 $]$
偶数だけを取り出すdata $[$ data \% 2 == 0 $]$
2つの条件の両方に合うもの(条件1) \& (条件2)
どちらかの条件に合うもの(条件1) $latex

実際にコードで「ふるい」にかけてみよう!

それでは、ランダムな数字の中から、特定の条件に合うものだけを抜き出してみましょう。

import numpy as np

-10から10までのランダムな整数を10個作る

data = np.random.randint(-10, 11, 10)

print("元のデータ:", data)

プラスの数字だけをフィルタリング

positive_data = data[data > 0]

print("プラスのみ:", positive_data)

5より大きい、または -5より小さいものを抽出

outliers = data[(data > 5) | (data < -5)]

print("端っこの値:", outliers)

実行するたびに、条件に合った数字だけが選ばれて表示されるはずです。まるで魔法のように、欲しいデータだけが手元に残りますね。

データの目利きになるための指針

フィルタリングをマスターした皆さんは、もう膨大なデータに圧倒されることはありません。自分の意志で、必要なデータだけを見つめることができるようになったからです!

これからの学習の指針として、ぜひ以下に挑戦してみてください。

  1. フィルタリングを使って、異常値(極端に大きすぎる、または小さすぎる数字)を見つけて削除する練習をしてみる。
  2. 条件に合う要素の「場所(番号)」だけを知りたいときに便利な np.where() という関数について調べてみる。
  3. 2次元の表データに対して、特定の列の条件で「行まるごと」を抜き出す操作に挑戦してみる。

「もし〜なら」という思考を、データ全体に対して一瞬で適用できる快感を、ぜひたくさん味わってください。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。