Pandasで複数条件抽出!AND・OR・NOTを使いこなすフィルタリング術 🔍


 

PandasのDataFrameから特定のデータを抽出する際、単一の条件だけでなく、複数の条件を組み合わせて絞り込みたい場面は頻繁に発生します。例えば、「売上が1000円以上かつ利益率が10%未満のデータ」や、「地域が東京または大阪のデータ」のように、複雑な条件でデータを選択する必要があるでしょう。

この記事では、Pandasで複数条件を扱うための基本となるAND(論理積)OR(論理和)、**NOT(論理否定)**の3つの論理演算子を使ったフィルタリング方法を、具体的なコード例を交えながら詳しく解説します。


 

論理演算子の基本:条件式を組み合わせる ➕➖

 

Pandasで複数条件のフィルタリングを行う際は、各条件式を丸括弧()で囲み、それらを論理演算子で連結します。

  • AND(論理積): すべての条件がTrueの場合にTrueを返します。Pandasでは**&**(アンパサンド)を使用します。

  • OR(論理和): いずれかの条件がTrueの場合にTrueを返します。Pandasでは**|**(パイプ)を使用します。

  • NOT(論理否定): 条件がFalseの場合にTrueを返します(条件を反転させます)。Pandasでは**~**(チルダ)を使用します。


 

AND (&) を使ってすべての条件を満たす行を抽出 🤝

 

AND条件は、指定したすべての条件がTrueである行を抽出したい場合に用います。

Python
 
import pandas as pd

df = pd.DataFrame({
    '商品名': ['A', 'B', 'C', 'D', 'E'],
    '価格': [100, 200, 150, 300, 50],
    '在庫数': [10, 50, 5, 20, 15]
})

print("--- 元のDataFrame ---")
print(df)

# 価格が100より大きく、かつ在庫数が20以下の商品を抽出
# 各条件式を `()` で囲み、`&` で連結します。
filtered_df_and = df[(df['価格'] > 100) & (df['在庫数'] <= 20)]

print("\n--- 価格 > 100 AND 在庫数 <= 20 の商品 ---")
print(filtered_df_and)
# 出力例:
#   商品名  価格  在庫数
# 2    C  150    5
# 3    D  300   20

 

複数のAND条件の連結

 

3つ以上の条件をANDで結合することも可能です。

Python
 
import pandas as pd

df = pd.DataFrame({
    '商品名': ['A', 'B', 'C', 'D'],
    'カテゴリ': ['フルーツ', '野菜', 'フルーツ', '肉'],
    '価格': [100, 80, 120, 500],
    '在庫数': [50, 100, 30, 20]
})

# カテゴリが「フルーツ」で、価格が100より大きく、在庫数が40未満の商品を抽出
filtered_multi_and = df[(df['カテゴリ'] == 'フルーツ') &
                        (df['価格'] > 100) &
                        (df['在庫数'] < 40)]

print("\n--- 複数AND条件の抽出 ---")
print(filtered_multi_and)
# 出力例:
#   商品名 カテゴリ  価格  在庫数
# 2    C   フルーツ  120   30

 

OR (|) を使って、いずれかの条件を満たす行を抽出 🧩

 

OR条件は、指定したいずれかの条件がTrueである行を抽出したい場合に用います。

Python
 
import pandas as pd

df = pd.DataFrame({
    '都市': ['東京', '大阪', '名古屋', '福岡', '札幌'],
    '人口(万人)': [1400, 900, 230, 160, 190],
    '評価': ['A', 'B', 'C', 'A', 'B']
})

# 人口が1000万人以上、または評価が「A」の都市を抽出
filtered_df_or = df[(df['人口(万人)'] >= 1000) | (df['評価'] == 'A')]

print("\n--- 人口 >= 1000 OR 評価 == 'A' の都市 ---")
print(filtered_df_or)
# 出力例:
#   都市  人口(万人) 評価
# 0  東京     1400  A
# 3  福岡      160  A

 

isin() と OR条件

 

特定のリストに含まれる値を持つ行を抽出したい場合、isin()メソッドが非常に便利です。これは複数のOR条件を簡潔に記述する代替手段となります。

Python
 
import pandas as pd

df = pd.DataFrame({
    '国': ['日本', 'アメリカ', 'イギリス', 'フランス'],
    'GDP(兆ドル)': [5.0, 25.0, 3.5, 2.9]
})

# '日本' または 'イギリス' の国を抽出
target_countries = ['日本', 'イギリス']
filtered_isin = df[df['国'].isin(target_countries)]

print("\n--- isin() で複数OR条件 ---")
print(filtered_isin)
# 出力例:
#     国  GDP(兆ドル)
# 0   日本         5.0
# 2  イギリス         3.5

 

NOT (~) を使って条件を反転させる ❌

 

NOT条件は、指定した条件が**Falseである行**を抽出したい場合に用います。特定の条件に当てはまらないデータを取得する際に使います。

Python
 
import pandas as pd

df = pd.DataFrame({
    '商品名': ['A', 'B', 'C', 'D'],
    'ステータス': ['公開中', '下書き', '公開中', '削除済み']
})

# ステータスが「公開中」ではない商品を抽出
filtered_df_not = df[~(df['ステータス'] == '公開中')]

print("\n--- ステータスが「公開中」ではない商品 ---")
print(filtered_df_not)
# 出力例:
#   商品名 ステータス
# 1    B   下書き
# 3    D  削除済み

 

複合条件でのNOT

 

NOTは他の論理演算子と組み合わせて使うこともできます。

Python
 
import pandas as pd

df = pd.DataFrame({
    'ID': [1, 2, 3, 4, 5],
    '種類': ['A', 'B', 'A', 'C', 'B'],
    '値': [10, 20, 5, 30, 15]
})

# 種類が「A」ではなく、かつ値が10より大きいデータを抽出
filtered_not_and = df[~(df['種類'] == 'A') & (df['値'] > 10)]

print("\n--- NOT A AND 値 > 10 のデータ ---")
print(filtered_not_and)
# 出力例:
#    ID 種類  値
# 1   2  B  20
# 3   4  C  30
# 4   5  B  15

 

まとめ:複数条件抽出のポイント 🎯

 

  • AND (&): すべての条件が真の行を抽出。

  • OR (|): いずれかの条件が真の行を抽出。

  • NOT (~): 条件を反転させ、偽の行を抽出。

  • 丸括弧 (): 各条件式を必ず丸括弧で囲み、演算子の優先順位を明確にする。

  • isin(): 複数のOR条件でリストに含まれるかを確認する際に便利。

これらの論理演算子を適切に使いこなすことで、Pandasでのデータフィルタリングが格段に柔軟かつ強力になります。複雑なビジネス要件や分析シナリオにも対応できるよう、ぜひこれらのテクニックをマスターしてください!