PythonのPandasで「複数条件での抽出」を行う方法について、実務的に役立つように整理して詳しく解説します。
特にDataFrameを扱う際に条件を組み合わせてデータをフィルタリングする操作は頻出ですので、基本から応用までまとめます。
目次
基本:単一条件での抽出
まずは1つの条件から。
import pandas as pd
# サンプルデータ
data = {
"name": ["Alice", "Bob", "Charlie", "David", "Eve"],
"age": [25, 30, 35, 40, 45],
"city": ["Tokyo", "Osaka", "Tokyo", "Nagoya", "Osaka"],
}
df = pd.DataFrame(data)
# 例: ageが30以上
df[df["age"] >= 30]
複数条件の組み合わせ(AND, OR)
PandasではPythonの論理演算子 (and
, or
) ではなく、以下を使います。
&
… AND(かつ)|
… OR(または)~
… NOT(否定)
条件は必ず 括弧 () で囲む必要があります。
# AND条件: ageが30以上 かつ cityが"Osaka"
df[(df["age"] >= 30) & (df["city"] == "Osaka")]
# OR条件: cityが"Tokyo" または ageが40以上
df[(df["city"] == "Tokyo") | (df["age"] >= 40)]
# NOT条件: cityが"Tokyo" ではない
df[~(df["city"] == "Tokyo")]
複数条件をisin()
で簡潔に書く
# cityがTokyoまたはOsaka
df[df["city"].isin(["Tokyo", "Osaka"])]
複数条件をquery()
で書く
query
を使うとSQLライクな記法になり、可読性が上がります。
# AND条件
df.query("age >= 30 and city == 'Osaka'")
# OR条件
df.query("city == 'Tokyo' or age >= 40")
# NOT条件
df.query("city != 'Tokyo'")
複数列をまとめて条件にする(複雑条件)
例1: 範囲条件
# 30 <= age <= 40
df[(df["age"] >= 30) & (df["age"] <= 40)]
例2: 複数列の比較
# ageと別の列の比較が必要な場合
df["score"] = [60, 75, 70, 90, 85]
df[df["age"] > df["score"]]
応用例:複数条件のリスト化・動的フィルタリング
例えばユーザー入力に応じて条件を動的に作りたい場合
conditions = (df["age"] >= 30) & (df["city"].isin(["Tokyo", "Osaka"]))
df[conditions]
よくある落とし穴
and
/or
を使うとエラーになる →&
/|
を使う- 括弧を省略すると優先順位の関係でエラーや誤動作する
- 文字列比較の際はクォートが必要(
city == "Tokyo"
)
まとめ
- 基本は
df[条件]
- ANDは
&
、ORは|
、NOTは~
- 条件は必ず()で囲む
isin()
やquery()
を使うと可読性が上がる- 複数列の比較や動的条件にも対応可能
以上、PythonのPandasの複数条件での抽出方法についてでした。
最後までお読みいただき、ありがとうございました。