今回は、Pythonのデータ分析ライブラリ「Pandas」を使って、インデックス番号でデータを抽出する方法(iloc
)について解説します。
▶️ ilocの公式ドキュメントも参考にしてください:
pandas DataFrame iloc Documentation
loc
は「ラベル名」で指定しましたが、iloc
は「番号」で行や列を選びます。
1. サンプルデータの作成
import pandas as pd
df = pd.DataFrame({
"名前": ["太郎", "花子", "次郎", "美香", "健一", "恵子", "翔", "茜", "隆", "葵"],
"年齢": [23, 29, 35, 42, 18, 33, 27, 24, 31, 30],
"職業": ["エンジニア", "デザイナー", "教師", "医師", "学生", "看護師", "プログラマー", "販売員", "弁護士", "研究者"],
"年収(円)": [4500000, 5500000, 4900000, 7300000, 0, 4000000, 6000000, 3200000, 8000000, 5800000],
"居住地": ["東京", "大阪", "名古屋", "札幌", "福岡", "東京", "神戸", "仙台", "横浜", "千葉"],
"勤続年数": [2, 4, 10, 15, 1, 5, 3, 1, 12, 8]
})
2. 特定行の抽出
2.1 範囲指定(インデックス番号で指定)
df.iloc[0:3]
出力例:
名前 年齢 職業 年収(円) 居住地 勤続年数
0 太郎 23 エンジニア 4500000 東京 2
1 花子 29 デザイナー 5500000 大阪 4
2 次郎 35 教師 4900000 名古屋 10
開始位置は含み、終了位置は含まないので、0, 1, 2行目が対象になります。
3. 特定列の抽出
3.1 1列だけ抽出する
df.iloc[:, 0:1]
出力例:
名前
0 太郎
1 花子
2 次郎
...(以下続く)
全行から「名前」列(0列目)だけを取り出す操作です。
3.2 複数列を抽出する
df.iloc[:, [df.columns.get_loc('名前'), df.columns.get_loc('年収(円)')]]
出力例:
名前 年収(円)
0 太郎 4500000
1 花子 5500000
2 次郎 4900000
...(以下続く)
get_loc()
は、「列名から番号(位置)を取得する関数」です。これにより列名を使わずに番号で柔軟に指定できるので、列数が多いデータにも便利です。
筆者の失敗談と改善策
初めてiloc
を使ったとき、私はdf.iloc[:, ['名前', '年収(円)']]
と書いてエラーを出してしまいました。
このようにiloc
では列名を使えず、番号だけを使う必要があるという基本を見落としていたのです。
# 誤りの例:ilocで列名を使っている(エラーになる)
df.iloc[:, ['名前', '年収(円)']]
# 正しい書き方(番号を使う)
df.iloc[:, [0, 3]]
改善策:「loc = ラベル名」「iloc = インデックス番号」という使い分けを常に意識して、エラーが出たときにはまずデータ型を確認するようにしています。
エラーを恐れず、しっかり原因を調べる姿勢が大切です。
4. locとilocの違いに注意
loc
ではラベル(列名)で指定できますが、iloc
は番号のみです。
# locの場合
print(df.loc[:, '名前']) # OK
print(df.loc[:, ['名前', '年収(円)']]) # OK
# ilocの場合
print(df.iloc[:, 0]) # 0列目(名前)
print(df.iloc[:, [0, 3]]) # 「名前」と「年収(円)」列(それぞれ0番・3番)
※ ilocでは文字列(列名)は使えません!
まとめ
- ilocは「位置番号」で行や列を選択する
- 範囲指定では開始位置を含み、終了位置は含まない
- 列名ではなく、列番号やインデックスを使う
- 複数列選択時はリストでまとめる
覚え方: loc = ラベル名、 iloc = インデックス番号
補足:ilocが便利な場面
- 列名が長かったり、覚えづらいとき
- インデックス番号だけで素早くデータを取り出したいとき
- 列名が途中で変わる可能性があるデータに対して処理するとき
次回は、条件に基づく行の抽出(フィルタリング)について詳しく解説します!
コメント