Pandasでデータを扱っていると、「行を取り出したい」「列だけを取り出したい」「特定の値だけ見たい」など、いろいろな操作が必要になります。
Pandasの「行・列・値のアクセス」と「条件による抽出方法」について、学習の記録としてまとめておこうと思います。
✅ 使用するデータフレーム
import pandas as pd
df = pd.DataFrame({
"都市名": ["東京", "ニューヨーク", "上海", "ローマ", "パリ", "モスクワ", "サンパウロ", "ロンドン"],
"面積(km2)": [2190, 783.8, 6340.5, 1285, 105.4, 2561, 1521, 1572],
"人口_万人": [1396, 841, 2487, 287, 216, 1250, 1230, 898]
})
print(df)
出力例:
都市名 面積(km2) 人口_万人
0 東京 2190.0 1396
1 ニューヨーク 783.8 841
2 上海 6340.5 2487
3 ローマ 1285.0 287
4 パリ 105.4 216
5 モスクワ 2561.0 1250
6 サンパウロ 1521.0 1230
7 ロンドン 1572.0 898
✅ アクセスと抽出の違いは?
| 区分 | 目的 | 例 | 結果 |
|---|---|---|---|
| アクセス | 明示的に場所を指定して取り出す |
df.loc[2], df["都市名"]
|
行や列、または値を取得 |
| 抽出 | 条件によって選び出す |
df[df["人口_万人"] > 1000], df.query("面積(km2) > 2000")
|
条件に一致する行を返す |
実際には混同されることもありますが、「アクセス=場所指定」「抽出=条件で選ぶ」と理解すると整理しやすいです。
✅ 1. 列へのアクセス
▶ 単一列を取得
df["都市名"]
▶ 複数列を取得
df[["都市名", "人口_万人"]]
▶ ドット記法(簡易表記)
df.都市名
※ ドット記法は、列名にスペースや記号が含まれるとエラーになるので注意です。
✅ 2. 行へのアクセス
▶ loc:ラベルで指定
df.loc[2]
都市名 上海
面積(km2) 6340.5
人口_万人 2487
Name: 2, dtype: object
複数行を取得:
df.loc[[2, 4, 6]]
▶ iloc:番号で指定
df.iloc[2]
複数行を取得:
df.iloc[[2, 4, 6]]
✅ 3. 値(単一要素)へのアクセス
▶ loc を使って(行ラベル × 列ラベル)
df.loc[2, "都市名"] # "上海"
▶ iloc を使って(行番号 × 列番号)
df.iloc[2, 0] # "上海"
✅ 4. 高速アクセス(at, iat)
▶ at:locと同じだが高速(1要素用)
df.at[2, "都市名"]
▶ iat:ilocと同じだが高速(1要素用)
df.iat[2, 0]
✅ 5. 条件による行の抽出(ブールインデックス)
▶ 等しい値で抽出
df[df["都市名"] == "東京"]
▶ 複数値で抽出(isin)
df[df["都市名"].isin(["東京", "パリ"])]
▶ 数値条件で抽出
df[df["人口_万人"] > 1000]
🔍 df[df["列名"] == 値] の考え方
この書き方は、内部で「条件式」をブール配列にして使っているだけです。
条件 = df["都市名"] == "東京"
df[条件]
このように「まず条件式 → それを使って抽出」と分けて考えるとわかりやすいと感じました。
✅ 6. query() を使った抽出
df.query("人口_万人 > 1000")
df.query("都市名 == '東京'")
※ 列名にスペースや記号が含まれる場合は `列名` のようにバッククォートで囲う必要があります。
✅ 7. インデックスを使った抽出
▶ インデックスが一致する行を抽出
df[df.index == 2]
▶ 複数インデックスで抽出(isin)
df[df.index.isin([1, 3, 5])]
✅ 8. 上下から抽出
df.head(3) # 先頭から3行
df.tail(2) # 最後から2行
✅ 9. ランダムに抽出
df.sample(1)
✅ アクセス・抽出方法まとめ表
| 操作 | 方法 | 戻り値 | 説明 |
|---|---|---|---|
| 列アクセス |
df["列名"] / df[["列1", "列2"]]
|
Series / DataFrame | 列を指定して取り出す |
| 行アクセス |
df.loc[行ラベル] / df.iloc[行番号]
|
Series | 行を取り出す |
| 値アクセス |
df.loc[行, 列] / df.iloc[行, 列]
|
単一値 | 行列を指定して値を取得 |
| 高速アクセス |
df.at[行, 列] / df.iat[行, 列]
|
単一値 | 少し高速な要素取得 |
| 条件抽出 |
df[条件] / df.query("条件")
|
DataFrame | 条件に一致する行を抽出 |
| インデックス条件 |
df[df.index == 値] / isin()
|
DataFrame | インデックスでの抽出 |
| ランダム抽出 | df.sample(n) |
DataFrame | ランダムに n 行抽出 |
| 上下抽出 |
df.head(n) / df.tail(n)
|
DataFrame | 上 or 下から n 行取得 |
✅ おわりに
Pandasには行・列・値を取り出すためのさまざまな方法がありますが、
「何を取り出したいのか?」「それは場所なのか? 条件なのか?」を意識することで、使い分けがしやすくなると感じました。
まずは基本的なアクセス方法(df[...], loc, iloc)を押さえた上で、
条件式や query() などの抽出方法に慣れていくのがよさそうです。
今回まとめた内容を定期的に見返しながら、Pandasの操作に自信をつけていこうと思います。