今回はpandasチュートリアルの三回目になっています。
前回のがまだという方は↓の記事を参照ください。
【python】データ分析のための「pandas」チュートリアル②:データフレームの中を見よう!
今回はデータフレームのフィルタリング操作を学んでいきましょう!!
全てサンプルコードを記載してあります。各々のpythonの環境で実際に手を動かしながら読み進めていってください。 サクッとやりたい方は、google colaboratoryが簡単でおすすめです。
pandasでフィルタリングとは?
Pythonでデータ分析をする際に、データフレームをフィルタリングすることはよくあります。特定の条件に合致する行のみを取り出すことで、分析に必要なデータだけを抽出できます。 具体的には、
- 指定したカラムの値が3以上の物を抽出
- 文字列列から、特定の文字列を含む行を抽出
- 複数の条件で抽出
このように、あなたが条件を指定して、それに沿ったデータだけを抽出する事が出来るのです。
データフレームのフィルタリング方法
では実際にやり方を見ていきましょう。 データフレームをフィルタリングするために、pandasでは[]
演算子を使用します。具体的には、以下のように条件を指定することで、条件に合致する行だけを抽出できます。
複数条件での指定
また、条件を複数指定する場合は、&
(AND)や|
(OR)を使用して条件を結合します。以下に例を示します。
エクセルで使った事がある人も多いと思いますが簡単に説明します。
ANDの場合、両方の条件にあてはまる場合のみTrueとなります。 ORの場合は、どちらかの条件にあてはまればTrueになります。
データの準備
ではまずデータセットの準備をしましょう。 前回までと同じくirisデータを使いましょう。
1 2 3 4 5 6 |
import pandas as pd import seaborn as sns # irisファイルを読み込む df = sns.load_dataset('iris') |
これでデータフレームが作成されました! ここまでの流れは大丈夫ですね?
実際にフィルタリングしてみよう
ではさっそくフィルタリングしてみましょう。 petal_length
が4より大きい行だけを抽出してみましょう。 以下のようにフィルタリングを行います。
1 2 |
# 4より大きい行だけ抽出 df[df["petal_length"] > 4] |
この結果は↓の画像の様になり、petal_lengthカラムが4より大きいレコードになりました。

ちなみに4以上や、4より小さい値を抽出したい時は下記のように書きます。
1 2 3 4 |
# 4以上を抽出 df[df["petal_length"] >= 4] # 4未満を抽出 df[df["petal_length"] < 4] |
ANDとORを使った抽出
条件によっては複数の列を参照する必要がある場合もありますね。
その場合は、&
(AND)や|
(OR)を使用して条件を結合しましょう。 まずはANDです。
1 2 |
# dfから"sepal_length"が7以上かつ"petal_length"が6以下の行を抽出する df[(df["sepal_length"] >= 7) & (df["petal_length"] <= 6)] |

続いてORの使い方を見ていきましょう。 この場合は|
(パイプ)を使います。
1 2 |
# dfから"sepal_length"が7以上かつ"petal_length"が6以下の行を抽出する df[(df["sepal_length"] >= 7) | (df["petal_length"] >= 6)] |
query()を使ってANDも出来る
pandasでは、query()
メソッドを使って条件式を文字列で指定することもできます。
1 |
df.query('sepal_length >= 7 and petal_length >= 6') |
文字列で指定
もちろん数値だけでなく文字列でも指定する事ができます。
今回の場合ですと、speciesが文字列のカテゴリーになっていますね。 こういったカテゴリーカラムで、特定のカテゴリーだけ抽出したいって事がおおいですね。 virginicaのレコードだけ抽出してみましょう。
1 2 |
# virginicaだけを抽出 df[df["species"] == 'virginica'] |

isin()を使ってOR条件でフィルタリングする
pandasでは、isin()
メソッドを使っても複数の値に一致する行を抽出することができます。たとえば、species列がvirginicaまたはversicolorである行を抽出するには以下のようにします。
1 |
df[df['species'].isin(['virginica', 'versicolor'])] |
()や[]の括り方が難しいですね~! 関数には()でデータフレームに[]というイメージでいきましょう。
not演算子でフィルタリングも出来る
not演算子を使用することで、条件式を満たさないデータを抽出できます。
not演算子は、~(チルダ)を用いて表現します。
この書き方も良く使いますね~。カテゴリーカラムなどで、あるカテゴリー以外を抽出したい時とかに楽です。 書き方は↓を見てください。~を入れる場所が少し難しいですね。
1 2 |
# setosa以外を抽出 df[~(df['species'] == 'setosa')] |
1 2 |
# sepal_lengthが5以下を抽出 df[~(df['sepal_length'] > 5)] |