1. データの「一部だけ」を取り出す
分析では「全データ」ではなく「特定の列だけ」「特定の患者だけ」を取り出したい場面が頻繁にあります。 pandasには、目的に応じた3つの選択方法があります。
| 書き方 | 用途 |
|---|---|
df["列名"] / df[["列A","列B"]] | 列を選ぶ |
df.loc[行ラベル, 列ラベル] | ラベル(名前)で行・列を選ぶ |
df.iloc[行番号, 列番号] | 位置(番号)で行・列を選ぶ |
まず [] による列選択から見ていき、次に行も選べる loc / iloc へ進みます。
特に loc と iloc の違いはpandasで最も混乱しやすいポイントなので、具体例でしっかり押さえましょう。
2. 列を選ぶ([])
列を選ぶには df["列名"] と書きます。1列なら Series、
df[["列A", "列B"]] のように リストで複数列を指定すると、その列だけの DataFrame が返ります。
⚠ 1列と複数列でカッコの数が違う:
1列は df["年齢"](カッコ1つ)、複数列は df[["患者ID","SBP"]](カッコ2つ)です。
外側の [] は「選択」、内側の [] は「列名のリスト」を意味します。
複数列なのにカッコを1つにすると KeyError になるので注意しましょう。
3. loc — ラベルで行・列を選ぶ
df.loc[行ラベル, 列ラベル] は、名前(ラベル)を使って行と列を同時に選べます。
「行はindexのラベル、列は列名」で指定します。行だけ・列だけの指定もできます。
🩺 医療データ文脈:
もしindexを患者IDにしておけば、df.loc["P003", "SBP"] のように
「P003さんのSBP」と人間が読める形で値を取り出せます。
ラベルでアクセスできる loc は、医療データのように「行が特定の対象(患者)を表す」場面で特に便利です。
4. iloc — 位置で行・列を選ぶ/locとの違い
df.iloc[行番号, 列番号] は、位置(0から数える番号)で行と列を選びます。
「上から何番目・左から何番目」という指定です。ラベルが何であっても、番号で機械的にアクセスできます。
⚠ 最重要:loc と iloc のスライスの違い
同じ「0から2まで」でも、loc と iloc で取れる行数が違います。ここがpandas最大の混乱ポイントです。
df.loc[0:2]… ラベル0〜2を含む → 0, 1, 2 の 3行df.iloc[0:2]… 位置2は含まない → 0, 1 の 2行
覚え方:loc(ラベル)は「終わりを含む」、iloc(位置)はPythonのスライスと同じで「終わりを含まない」。
iloc は range() やリストのスライスと同じ感覚、と覚えると混乱しません。
💡 loc と iloc の使い分け:
- 名前(ラベル)で選びたい →
loc(「P003さんの」「SBP列の」) - 位置(番号)で選びたい →
iloc(「先頭5行」「左から2列目」)
迷ったら「名前で指定する=loc、番号で指定する=iloc」と覚えればOKです。
5. 練習問題
複数列を選択しよう
下記の df から、「患者ID」と「BMI」の2列だけを取り出して表示してください。
ヒントを見る(答え+解説)
import pandas as pd
df = pd.DataFrame({
"患者ID": ["P001","P002","P003"],
"年齢": [45, 62, 33],
"SBP": [120, 145, 118],
"BMI": [22.5, 28.1, 24.0],
})
# 「患者ID」と「BMI」の2列を取り出して表示してください
print(df[["患者ID", "BMI"]])
複数列は 列名のリストを [[ ]] で渡します。カッコが2つになる点に注意。結果はその2列だけのDataFrameになります。
loc で特定の値を取り出そう
下記の df から、loc を使って 行ラベル2・列「SBP」の値を取り出して表示してください。
ヒントを見る(答え+解説)
import pandas as pd
df = pd.DataFrame({
"患者ID": ["P001","P002","P003","P004"],
"SBP": [120, 145, 118, 138],
})
# loc を使って 行ラベル2・列「SBP」の値を表示してください
print(df.loc[2, "SBP"]) # 118
df.loc[行ラベル, 列ラベル] で、特定の1つの値を取り出せます。行ラベル2(=3人目・P003)のSBPは 118 です。
iloc で先頭2行を取り出そう
下記の df から、iloc を使って 先頭2行を取り出して表示してください。
(ヒント:ilocのスライスは「終わりを含まない」)
ヒントを見る(答え+解説)
import pandas as pd
df = pd.DataFrame({
"患者ID": ["P001","P002","P003","P004","P005"],
"SBP": [120, 145, 118, 138, 160],
})
# iloc を使って先頭2行を取り出して表示してください
print(df.iloc[0:2]) # 位置0,1 の2行(2は含まない)
df.iloc[0:2] は位置0と1の2行を返します(2は含まない=Pythonのスライスと同じ)。df.head(2) でも同じ結果が得られます。locだと df.loc[0:1] で同じ2行になる点と比べると、違いがよく分かります。
6. まとめ
このレッスンのポイント
df["列"]=1列(Series)/df[["列A","列B"]]=複数列(DataFrame・カッコ2つ)loc[行ラベル, 列ラベル]:名前(ラベル)で選ぶiloc[行番号, 列番号]:位置(番号)で選ぶ- スライスの違い:loc は終わりを含む(0:2→3行)/ iloc は含まない(0:2→2行)
- 名前で選ぶ=loc、番号で選ぶ=iloc
自由に試してみましょう:
完了するとコース一覧に進捗が記録されます