0Pricing
Pandas & NumPy Academy · レッスン

isin()とbetween()によるフィルタ

isin()で列の値がリスト内にある行を、between()で数値範囲内にある行を選択します。

「isin()とbetween()によるフィルタ」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

isin()メソッドの概要

isin()は、Seriesの各要素が指定した値のリスト(または集合)に含まれているかを確認します。返されるブールSeriesは、行のフィルタリングにそのまま使用できます。複数の==比較を|で連結するよりも簡潔で、多くの場合高速です。

たとえば、(df['country'] == 'USA') | (df['country'] == 'UK')の代わりに、df['country'].isin(['USA', 'UK'])と記述できます。

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'Germany', 'UK', 'France', 'USA'],
    'sales': [400, 200, 150, 300, 600]
})

# Check membership
mask = df['country'].isin(['USA', 'UK'])
print(mask.tolist())  # [True, False, True, False, True]

result = df[mask]
print(result)
#   country  sales
# 0     USA    400
# 2      UK    150
# 4     USA    600

高速化のためのisin()と集合

isin()にはリストの代わりにPythonの集合を渡すことができます。集合でのメンバーシップ検索はO(1)であり、リストが大きくなっても遅くなりません。許可する値が数千件ある場合、この違いは重要で、集合を使ったisin()はリストを使う場合より大幅に高速になります。

import pandas as pd

df = pd.DataFrame({
    'sku': ['A001', 'B002', 'A003', 'C004', 'B005'],
    'qty': [10, 5, 3, 8, 12]
})

# Use a set for fast membership check
allowed_skus = {'A001', 'A003', 'B005'}
result = df[df['sku'].isin(allowed_skus)]
print(result)
#     sku  qty
# 0  A001   10
# 2  A003    3
# 4  B005   12

~によるisin()の否定

isin()と~演算子を組み合わせると、列に指定した値が含まれない行をフィルタリングできます。特定の値のリストを除外する最も簡潔な方法であり、複数の!=比較を連結するよりもはるかに読みやすくなります。

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'cancelled', 'shipped', 'refunded', 'active'],
    'amount': [100, 200, 300, 150, 500]
})

bad_statuses = ['cancelled', 'refunded']
# Keep all rows NOT in the excluded list
result = df[~df['status'].isin(bad_statuses)]
print(result)
#     status  amount
# 0   active     100
# 2  shipped     300
# 4   active     500

DataFrameの列をリストとして使うisin()

別のDataFrameの列の値をisin()に渡す便利な方法があります。これはSQLのセミ結合と同等で、df2にキーが存在するdf1の行だけを残します。完全なマージとは異なり、行を重複させたり列を追加したりせず、フィルタリングだけを行います。

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4, 5],
    'revenue': [100, 200, 300, 400, 500]
})

vip_orders = pd.DataFrame({'order_id': [2, 4]})

# Keep orders whose ID appears in vip_orders
result = orders[orders['order_id'].isin(vip_orders['order_id'])]
print(result)
#    order_id  revenue
# 1         2      200
# 3         4      400

between()メソッドの概要

between(left, right)は、値が閉区間[left, right](デフォルトでは両端を含む)の範囲内にある位置でTrueになるブールSeriesを返します。(df['age'] >= 18) & (df['age'] <= 65)のような両側の条件を、読みやすい1回の呼び出しに置き換えられます。

inclusiveパラメーターで境界を含めるかどうかを制御できます。指定できる値は'both'(デフォルト)、'left'、'right'、'neither'です。

import pandas as pd

df = pd.DataFrame({
    'age': [15, 22, 35, 67, 45, 8]
})

# Select working-age population
result = df[df['age'].between(18, 65)]
print(result)
#    age
# 1   22
# 2   35
# 4   45

inclusiveパラメーターを使ったbetween()

デフォルトでは、両方の端点が範囲に含まれますinclusive='left'にすると右側の境界を除外できます(時間区間のような半開区間に便利です)。inclusive='right'では左側を除外し、inclusive='neither'では両方の端点を除外して、厳密な開区間になります。

import pandas as pd

df = pd.DataFrame({'score': [0, 50, 100, 75, 50]})

# Include only scores strictly between 50 and 100
strict = df[df['score'].between(50, 100, inclusive='neither')]
print(strict)
#    score
# 3     75

# Include 50 but not 100
left_closed = df[df['score'].between(50, 100, inclusive='left')]
print(left_closed)
#    score
# 1     50
# 3     75
# 4     50

日付列に対するbetween()

between()はdatetime列にも使用できます。境界値として日付文字列またはTimestampオブジェクトを渡すと、Pandasが基となるdatetime値を比較します。日付を整数に変換せずに時間範囲を切り出せる、すっきりした方法です。

import pandas as pd

df = pd.DataFrame({
    'date': pd.to_datetime(['2024-01-01', '2024-06-15', '2024-11-20', '2025-03-01']),
    'value': [10, 20, 30, 40]
})

# Filter rows in the year 2024
result = df[df['date'].between('2024-01-01', '2024-12-31')]
print(result)
#         date  value
# 0 2024-01-01     10
# 1 2024-06-15     20
# 2 2024-11-20     30

isin()とbetween()の組み合わせ

isin()とbetween()は、&や|を使って同じブール式内で組み合わせられます。これにより、何重もの条件が必要になる処理を、簡潔で読みやすいフィルターとして記述できます。組み合わせるときは、各呼び出しを必ず括弧で囲んでください。

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'North', 'West'],
    'revenue': [100, 500, 200, 300, 400]
})

# Rows in North or South regions AND revenue between 200 and 400
result = df[
    df['region'].isin(['North', 'South']) &
    df['revenue'].between(200, 400)
]
print(result)
#    region  revenue
# 3   North      300
# 1   South      500  <- actually excluded (500 > 400)
# 3   North      300

anyを使った複数列へのisin()

複数の列のいずれかに、リスト内の値が含まれているか確認したい場合は、DataFrame全体にisin()を呼び出し、.any(axis=1)で結果を行単位に集約できます。複数のタグ列やカテゴリ列を同時に検索する場合に便利です。

import pandas as pd

df = pd.DataFrame({
    'tag1': ['python', 'java', 'sql'],
    'tag2': ['sql', 'python', 'go'],
    'topic': ['Database', 'Backend', 'Infra']
})

target_langs = ['python', 'sql']
# Check if either tag column matches
mask = df[['tag1', 'tag2']].isin(target_langs).any(axis=1)
result = df[mask]
print(result)
#      tag1    tag2     topic
# 0  python     sql  Database
# 1    java  python   Backend
# 2     sql      go     Infra

パフォーマンスのヒント:isin()と複数の==の比較

値が2~3個の小さなリストでは、isin()と==条件の連結による違いはほとんどありません。しかし、数百個の値を含む大きなリストでは、isin()のほうが大幅に高速です。内部でリストをハッシュセットに変換し、要素ごとにO(1)で検索するためです。順番に比較する必要がありません。

コードの読みやすさとパフォーマンスを高めるため、長い|条件の連結よりも常にisin()を優先してください。

import pandas as pd
import numpy as np

# 1 million row DataFrame
df = pd.DataFrame({'id': np.random.randint(0, 10000, size=1_000_000)})

allowed = list(range(0, 500))  # 500 allowed IDs

# isin() is the right approach here — fast hash lookup
result = df[df['id'].isin(allowed)]
print(result.shape)  # around (50000, 1)

実世界のフィルター:商品カタログ

ここでは、カテゴリのフィルタリングにisin()を、価格帯のフィルタリングにbetween()を使用する現実的な例を示します。これはeコマース分析でよく使われるパターンです。2つのフィルターを組み合わせることで、対象を絞ったプロモーションに必要な商品だけを正確に選択できます。

import pandas as pd

products = pd.DataFrame({
    'name': ['Laptop', 'Mouse', 'Monitor', 'Keyboard', 'Webcam'],
    'category': ['Computing', 'Accessories', 'Displays', 'Accessories', 'Peripherals'],
    'price': [1200, 25, 300, 80, 150]
})

# Products in Accessories or Peripherals, priced 50-200
eligible = products[
    products['category'].isin(['Accessories', 'Peripherals']) &
    products['price'].between(50, 200)
]
print(eligible)
#        name     category  price
# 3  Keyboard  Accessories     80
# 4    Webcam  Peripherals    150

理解度チェック

isin()とbetween()のフィルターについて理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、isin()は集合への所属を確認し、複数の==条件を連結するより高速であること、~isin()で値のリストを除外できること、そしてbetween()でinclusiveパラメーターを指定できる閉区間をフィルタリングできることを学びました。どちらのメソッドも、数値列、文字列列、datetime列で使用できます。次は、名前のパターンに一致するDataFrame列を選択する方法について学びます。

よくある質問

「isin()とbetween()によるフィルタ」レッスンは無料ですか?

はい。「isin()とbetween()によるフィルタ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「isin()とbetween()によるフィルタ」で何を学びますか?

isin()で列の値がリスト内にある行を、between()で数値範囲内にある行を選択します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「isin()とbetween()によるフィルタ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DataFrameのブールインデックス
  2. query()メソッド
  3. isin()とbetween()によるフィルタ
  4. パターンによる列の選択
← Pandas & NumPy Academyに戻る