Python環境を起動中... 初回のみ数秒かかります
Lesson 6 / 12

条件でデータを抽出する

このレッスンで学ぶこと

  • ブール選択で「条件に合う行」だけを抽出できる
  • 複合条件(かつ・または)で絞り込める
  • query() で条件を読みやすく書ける
  • isin() で「いずれかに当てはまる」行を抽出できる

1. 「条件に合う行だけ」を取り出す

データ分析で最も頻繁に行うのが、「ある条件を満たす行だけを抜き出す」操作です。 「血圧が140以上の患者」「BMIが30を超える人」「特定の診断名の患者」—— こうした絞り込みは、pandasなら1行で書けます。これを フィルタリング(条件抽出) と言います。

Excelの「フィルタ機能」をコードで行うイメージです。しかも一度書けば、来月の新しいデータにも同じ条件をそのまま適用できます。

2. ブール選択 — 条件に合う行を抽出

列に比較演算子(>=<== など)を適用すると、 各行が条件を満たすか(True / False)の 判定結果が得られます。 それを df[判定結果] のように使うと、Trueの行だけが抽出されます。

sample_1.py
Ctrl+Enter
出力

💡 len() で件数を数える: 抽出した結果の行数は len(df) で数えられます。 「条件に合う患者は何人いるか」をすぐ確認でき、分析でとても便利です。 上の例では SBP≥140 の患者は P002 と P005 の 2人です。

3. 複合条件 — 「かつ」「または」で絞り込む

複数の条件を組み合わせるには、「かつ」は &、「または」は | を使います。 そして、各条件は必ずカッコ () で囲む必要があります。

and/or ではなく &/|、各条件はカッコで囲む

pandasの複合条件では、Pythonの and / or は使えずエラーになります。次のルールを徹底してください。

  • &  ...  かつ(AND)
  • |  ...  または(OR)
  • 各条件は (df["SBP"] >= 140) のようにカッコで囲む
# ❌ エラー
df[df["SBP"] >= 140 and df["年齢"] >= 60]

# ✅ 正解
df[(df["SBP"] >= 140) & (df["年齢"] >= 60)]
sample_2.py
Ctrl+Enter
出力

🩺 医療データ文脈: 「高血圧(SBP≥140)かつ高齢(60歳以上)」のように、複数のリスク要因を組み合わせて ハイリスク群を抽出するのは、医療データ分析の定番です。 条件を組み合わせるほど、より精密なグループの抽出ができます。

4. query と isin — もっと便利な抽出

条件抽出には、さらに読みやすく書ける方法もあります。

query:条件を文字列で書く

df.query("条件式") は、条件を文字列で書ける方法です。 & の代わりに and| の代わりに or が使え、カッコも不要なので、 条件が複雑になるほど読みやすくなります。

isin:複数の値のいずれか

df["列"].isin([値1, 値2, ...]) は、 「列の値が、リストのいずれかに当てはまるか」を判定します。 「診断名が高血圧 または 糖尿病」のような抽出を、簡潔に書けます。

sample_3.py
Ctrl+Enter
出力

💡 使い分けの目安:

  • シンプルな条件 → ブール選択df[df["SBP"] >= 140]
  • 複雑な条件を読みやすく → querydf.query("...")
  • 「複数の値のいずれか」 → isindf[df["列"].isin([...])]

どれも結果は同じDataFrameです。場面に応じて読みやすい書き方を選びましょう。

5. 練習問題

問題 1

BMIが基準を超える患者を抽出しよう

下記の df から、BMIが25以上の患者を抽出し、その人数も表示してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
import pandas as pd

df = pd.DataFrame({
    "患者ID": ["P001","P002","P003","P004","P005"],
    "BMI":   [22.5, 28.1, 24.0, 26.2, 30.5],
})

# BMIが25以上の患者を抽出し、人数も表示してください
over25 = df[df["BMI"] >= 25]
print(over25)
print("該当:", len(over25), "人")   # 3

df[df["BMI"] >= 25] で条件を満たす行だけが抽出されます。BMI25以上は P002・P004・P005 の 3人len() で人数を数えられます。

問題 2

複合条件でハイリスク群を抽出しよう

下記の df から、「SBPが140以上」かつ「BMIが27以上」の患者を抽出してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
import pandas as pd

df = pd.DataFrame({
    "患者ID": ["P001","P002","P003","P004","P005"],
    "SBP":   [120, 145, 118, 152, 160],
    "BMI":   [22.5, 28.1, 24.0, 23.0, 30.5],
})

# SBPが140以上 かつ BMIが27以上 の患者を抽出してください
risk = df[(df["SBP"] >= 140) & (df["BMI"] >= 27)]
print(risk)   # P002 と P005 の2人

「かつ」は &、各条件はカッコで囲みます。両方を満たすのは P002(SBP145・BMI28.1)と P005(SBP160・BMI30.5)の2人。P004 は SBP152 ですが BMI23.0 なので除外されます。

問題 3

isinで特定の診断名を抽出しよう

下記の df から、isin を使って 診断名が「高血圧」または「心不全」の患者を抽出してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
import pandas as pd

df = pd.DataFrame({
    "患者ID": ["P001","P002","P003","P004","P005"],
    "診断名": ["高血圧","糖尿病","心不全","健常","高血圧"],
})

# isin を使って「高血圧」または「心不全」の患者を抽出してください
target = df[df["診断名"].isin(["高血圧", "心不全"])]
print(target)   # P001, P003, P005 の3人

df["診断名"].isin(["高血圧", "心不全"]) で、診断名がリストのいずれかに当てはまる行を判定できます。該当は P001・P003・P005 の3人。| を何度も書くより簡潔です。

6. まとめ

このレッスンのポイント

  • ブール選択:df[df["列"] >= 値] で条件に合う行を抽出
  • 複合条件:「かつ」は &、「または」は |各条件はカッコで囲む
  • and/or は使えない(エラーになる)ので注意
  • query("条件式"):条件を文字列で読みやすく書ける
  • isin([値1, 値2]):複数の値のいずれかに当てはまる行を抽出
  • len() で該当件数を数えられる

自由に試してみましょう:

free_practice.py
出力

完了するとコース一覧に進捗が記録されます