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
である行を抽出したい場合に用います。
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で結合することも可能です。
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
である行を抽出したい場合に用います。
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条件を簡潔に記述する代替手段となります。
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
である行**を抽出したい場合に用います。特定の条件に当てはまらないデータを取得する際に使います。
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は他の論理演算子と組み合わせて使うこともできます。
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でのデータフィルタリングが格段に柔軟かつ強力になります。複雑なビジネス要件や分析シナリオにも対応できるよう、ぜひこれらのテクニックをマスターしてください!