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 500DataFrameの列をリストとして使う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 400between()メソッドの概要
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 45inclusiveパラメーターを使った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 30isin()と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 300anyを使った複数列への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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- DataFrameのブールインデックス
- query()メソッド
- isin()とbetween()によるフィルタ
- パターンによる列の選択