1. 「条件に合う行だけ」を取り出す
データ分析で最も頻繁に行うのが、「ある条件を満たす行だけを抜き出す」操作です。 「血圧が140以上の患者」「BMIが30を超える人」「特定の診断名の患者」—— こうした絞り込みは、pandasなら1行で書けます。これを フィルタリング(条件抽出) と言います。
Excelの「フィルタ機能」をコードで行うイメージです。しかも一度書けば、来月の新しいデータにも同じ条件をそのまま適用できます。
2. ブール選択 — 条件に合う行を抽出
列に比較演算子(>=・<・== など)を適用すると、
各行が条件を満たすか(True / False)の 判定結果が得られます。
それを df[判定結果] のように使うと、Trueの行だけが抽出されます。
💡 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)]
🩺 医療データ文脈: 「高血圧(SBP≥140)かつ高齢(60歳以上)」のように、複数のリスク要因を組み合わせて ハイリスク群を抽出するのは、医療データ分析の定番です。 条件を組み合わせるほど、より精密なグループの抽出ができます。
4. query と isin — もっと便利な抽出
条件抽出には、さらに読みやすく書ける方法もあります。
query:条件を文字列で書く
df.query("条件式") は、条件を文字列で書ける方法です。
& の代わりに and、| の代わりに or が使え、カッコも不要なので、
条件が複雑になるほど読みやすくなります。
isin:複数の値のいずれか
df["列"].isin([値1, 値2, ...]) は、
「列の値が、リストのいずれかに当てはまるか」を判定します。
「診断名が高血圧 または 糖尿病」のような抽出を、簡潔に書けます。
💡 使い分けの目安:
- シンプルな条件 → ブール選択(
df[df["SBP"] >= 140]) - 複雑な条件を読みやすく → query(
df.query("...")) - 「複数の値のいずれか」 → isin(
df[df["列"].isin([...])])
どれも結果は同じDataFrameです。場面に応じて読みやすい書き方を選びましょう。
5. 練習問題
BMIが基準を超える患者を抽出しよう
下記の df から、BMIが25以上の患者を抽出し、その人数も表示してください。
ヒントを見る(答え+解説)
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() で人数を数えられます。
複合条件でハイリスク群を抽出しよう
下記の df から、「SBPが140以上」かつ「BMIが27以上」の患者を抽出してください。
ヒントを見る(答え+解説)
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 なので除外されます。
isinで特定の診断名を抽出しよう
下記の df から、isin を使って 診断名が「高血圧」または「心不全」の患者を抽出してください。
ヒントを見る(答え+解説)
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()で該当件数を数えられる
自由に試してみましょう:
完了するとコース一覧に進捗が記録されます