Pandasのset_index
関数は、DataFrameのインデックス(行ラベル)を指定した列に置き換えるための関数です。
これを理解して活用すると、データ処理や検索が効率的になり、グループ化や結合処理にも大きく役立ちます。以下で、詳しく解説します。
目次
基本構文
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
※このコード単体では、出力はできません。
主な引数
- keys
インデックスに設定する列名、または列名のリスト。
例:"column_name"
または["col1", "col2"]
- drop (デフォルト: True)
インデックスに設定した列をDataFrame本体から削除するかどうか。 True
→ インデックスに設定した列は削除されるFalse
→ 元の列を残したままインデックス化される- append (デフォルト: False)
既存のインデックスに加えて、新しい列を追加でインデックスにするかどうか。 True
→ 現在のインデックスに列を追加してMultiIndexにするFalse
→ 現在のインデックスを置き換える- inplace (デフォルト: False)
新しいDataFrameを返すか、その場で変更するか。 True
→ 元のDataFrameを直接変更False
→ 新しいDataFrameを返す- verify_integrity (デフォルト: False)
インデックスに重複がないかを検証する。 True
→ 重複があるとエラーFalse
→ 重複を許容(一般的にはこちら)
基本的な使い方
import pandas as pd
df = pd.DataFrame({
"id": [101, 102, 103],
"name": ["Alice", "Bob", "Charlie"],
"score": [85, 90, 95]
})
print(df)
例1: 単一列をインデックスにする
df_indexed = df.set_index("id")
print(df_indexed)
→ id
列がインデックスとして利用される。
例2: drop=False で元の列を残す
df_indexed = df.set_index("id", drop=False)
print(df_indexed)
→ インデックスとしても使え、列としても保持できる。
例3: 複数列をインデックスにする
df_multi = df.set_index(["id", "name"])
print(df_multi)
→ MultiIndex(階層的インデックス)が設定される。
例4: append=True で既存のインデックスに追加する
df_append = df.set_index("id", append=True)
print(df_append)
→ もともとの「行番号」インデックスに「id」が追加され、二重インデックスになる。
reset_index
との関係
set_index
でインデックスに変えた列は、reset_index
で元に戻せます。
df_indexed = df.set_index("id")
df_reset = df_indexed.reset_index()
print(df_reset)
→ 元の形に戻る。
よくある活用シーン
検索を効率化する
- IDやユニークキーをインデックスにすることで
loc
による高速アクセスが可能。
print(df_indexed.loc[102])
データの整形
- 複数の属性(例: 年+月)をインデックスにすると、時系列やグループ分析がしやすい。
結合(merge/join)前処理
set_index
でキーを設定してからjoin
を使うと直感的に結合できる。
注意点
- 重複がある列をインデックスにすると、検索時に複数行が返る
- verify_integrity=True を使えばエラーを出せるが、パフォーマンスは落ちる
inplace=True
を乱用すると、元データが失われるのでおすすめしない(可読性低下)
まとめ
set_index
は「列を行ラベル(インデックス)」に変換するための関数- よく使うオプションは
drop
,append
- 検索、集計、結合の前処理にとても便利
reset_index
とセットで使うことが多い
以上、PythonのPandasのset_index関数についてでした。
最後までお読みいただき、ありがとうございました。