たなブログ 教養を高めて生涯資産を増やすブログ(`・ω・´)

【Python Coding】pandasの「isin」の使い方を解説【条件抽出が可能になる】

PR Pythonを学ぶ

こんにちは、たなです。

「pandasの “isin” ってどうやって使えばいいのか」

今回はそんな方向けにpythonのpandasにある機能「isin」を使って条件抽出をする方法を紹介していきます。

pandasのデータフレームから欲しいデータを抽出したい場面で使えるので、データ分析力向上にもつながります。今回はどちらかというと中上級者向けの内容になりますが、初心者の方でもわかりやすいように説明していくので、基本的な部分(基本編)だけでも抑えるようにしてみてください。

本記事の内容

  • 【基本編】pandas「isin」を使って条件抽出する方法
  • 【応用編】pandas「isin」を使って時系列データにフラグを立てる

僕のブログでは【完全ガイド】pythonの学習サイトをレベル別に紹介!【基礎から機械学習・人工知能までのロードマップ】という記事も公開しています。より高みを目指したい人は参考にしてみてください。

pythonの学習ロードマップへ

pythonのpandas「isin」を使って条件抽出をする方法


まずは基本的な使い方を確認し、その後に事例を踏まえて時系列データでisinを活用していきます。そんなに難しくないです。

【基本編】pandasのisinを使って条件抽出をする

以下のステップで理解を深めていきます。

  • 【ステップ①】 必要ライブラリのインポート
  • 【ステップ②】 利用データの作成
  • 【ステップ③】 isinはの返り値は「bool型」であることを理解する
  • 【ステップ④】 isinの使い方を知る

まずは必要ライブラリをインポート【ステップ①】

まず最初に、今回使うライブラリをインポートしておきます。
今回はpandasだけ使っていくので、以下ライブラリのインポートをしておいてください。

import pandas as pd

利用データを作成しておく【ステップ②】 

ここでは、手元にあるタイタニックのデータを使っていきたいと思います。

今回はpandas「isin」の使い方を理解することが目的なので、データは何でもOKです。手元にあるデータ使うかオリジナルのデータを作って、挙動を確認してみてください。

data = pd.read_csv('./data/titanic-train.csv',encoding='utf-8')
data.head()
基礎で使うデータセット(タイタニック)


上記データを用いて「isin」のコードを確認していきます。

isinはbool型を返すことを理解しておく【ステップ③】 

ここ大事です。

isinを使った場合、その返り値は「bool型」を返してきます。TrueかFalseかというやつですね。当たり前かもしれませんが、型はしっかりと意識しておきましょう。

たとえば、データフレーム内にある値が存在するかどうかを「isin」を使って確かめたとしましょう。

  • データフレーム内に値が存在する場合:Trueを返す
  • データフレーム内に値が存在しない場合:Falseを返す

こんな感じになるということです。この点を踏まえた上で、実際の使い方を見ていきます。

isinを使えるようにする【ステップ④】

タイタニックデータにはいくつかカラムがありますが、まず「男性(male)」のデータが含まれていることを確認してみます。具体的なコードは以下のようになります。

data['Sex'].isin(['male'])

先ほどと同じ要領ですが

  • タイタニックデータに男性(male)が含まれている場合:Trueを返す
  • タイタニックデータに男性(male)が含まれていない場合:Falseを返す

となります。Falseが帰ってきたら「女性(female)」ということですね。

これをうまく使えば「男性だけ」のデータを表示させることも可能です。

flag = data['Sex'].isin(['male'])
data[flag].head()
isinを使って「男性」のデータだけを表示した結果


性別が「male」のみになっていることが確認出来ます。

今度は別のカラムを使って、データを抽出してみます。
生存者を意味する「Survived(1)」のデータを取得していきます。

data['Survived'].isin([1])

先ほどは文字列を指定しましたが、今回は数値を指定するだけです。
返り値は「True」「False」となるので、先ほどと同様に「True」データのみ(生存者のみ)を表示させます。

flag = data['Survived'].isin([1])
data[flag].head()
isinを使って「生存者」のデータだけを表示した結果


「Survived」がすべて「1」になっているのがわかりますね。

以上がpandas「isin」の基本的な使い方となります。

「条件式を用いる方法」や「in演算子を用いる方法」と実質的に同じ効果となりますが、色々な方法を比較検討して自分が使いやすい方法を用いるようにしてみてください。

【応用編】pandasのisinを使って条件抽出をする

応用編として個人的によく使う方法を紹介しておきたいと思います。

応用編というほどではないかもしれませんが「こんな使い方もあるのね」と思ってください。具体的には「時系列データ」を扱うような場面で使えます。

飲食店から「販売量予測」を依頼された場合を想定

今回はこんなケースを想定してみたいと思います。

需要予測をするには複合的な要因を紐解く必要があるのでかなり難しいですが、需要予測に影響を与えている要因の一つとして「平日か週末か」が考えられます。週末はお休みの方が多いので、相対的に需要は増える傾向にありますよね。

そこで今回は、「週末かどうか」が販売需要に影響を与えるものと仮定して、週末フラグを作りたいと思います。こういった時に使えるのが「isin」なのです。

まずは、以下のように日付データを適当に用意しておきます。

#日付データを用意
s1 = pd.Series(pd.date_range(start="2020-01-01",periods=366,name="Date"))
s2 = pd.Series([f"day-{i}" for i in range(1,367)],name="day-N")

df = pd.concat([s1,s2],axis=1)
df["weekday1"] = df["Date"].dt.day_name()
df["weekday2"] = df["Date"].dt.dayofweek

df.head(10)
日付データを作成


こんな感じで、日付とそれに対応する曜日を数字付きで用意してみました。

このデータをもとに週末フラグを作っていきます。SaturdayとSundayなら「1」を、それ以外なら「0」としていきたいのですが、曜日名だと扱いづらいですよね(weekday1の列)。そのため、数値で表示されているweekday2という列をあらかじめ用意しておいたのです。

月曜日が「0」始まりとなるので、週末は「5(土曜日)」と「6(日曜日)」ということになります。これを理解した上でコードを書くと、このようになります。

#週末flagの作成
flag = df["weekday2"].isin([5,6])
df["weekend_flag"] = flag.astype(int)
df.head(10)
isinを用いて、週末フラグ(weekend_flag)を作成した結果


繰り返しになりますが、返り値はbool型です。Trueを「1」、Falseを「0」として変換する必要があるので、astype(int)を使っています。


結果として「Saturday」「Sunday」に週末フラグ(1)を立てることが出来ました。あとはこの特徴量を使って、モデル構築やデータ予測をしていく流れとなります。

一例ですが、データ分析の現場でも使えるので良ければ活用してみてください。

まとめ:pandas「isin」を使えば条件抽出がスムーズに出来る。データ分析力を上げるなら知っておこう。


今回の記事をまとめます。

  • pandasの”isin”は条件抽出に使える
  • “isin”の返り値は「bool型」
  • “isin”を応用すれば時系列データにも使える

こんな感じですね。

pandasの「isin」に限った話ではありませんが、データ分析力は現場を通じて少しずつ磨いていくことが出来ます。今、目の前にあるデータの本質を見抜くためにも、色々な方法を研究してみてください。

冒頭でも紹介しましたが、pythonの学習方法を【完全ガイド】pythonの学習サイトをレベル別に紹介!【基礎から機械学習・人工知能までのロードマップ】でまとめています。良ければあわせて読んでみてください。

良いpythonライフを。