PandasにおいてDataFrameに存在するIndexオブジェクトを追加・変更するset_index
関数を使った列データをインデックスとして利用する方法を解説します。
PandasのIndexの基礎と使い方については以下の記事で解説しています。
PandasのIndexの理解と使い方まとめ /features/pandas-index.html
Indexオブジェクトの設定・追加
set_indexを使って列データをインデックスとして追加・設定する
まずはset_index
関数のAPIドキュメントを見てみましょう。
pandas.DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
params:
パラメータ名 | 型 | 概要 |
---|---|---|
keys |
カラムのラベルまたは そのリスト/配列 |
インデックスに使うカラム(列)を指定します。 |
drop |
bool値 | 初期値 True Indexとして使われるカラム(列)データを削除するか指定します。 |
append |
bool値 | 初期値 False 既存のインデックスに追加する形にするかどうかを指定します。Falseのときは既存のインデックスは削除されます。 |
inplace |
bool値 | 初期値 False 行った操作を元のDataFrameに反映するかどうかを指定します。 |
verify_integrity |
bool値 | 初期値 False インデックスに使われる値で被りがないかチェックをするか指定します。 |
returns:
新たにインデックスが指定されたDataFrame
では実際のコードで使い方を見ていきます。以下のファイルを読み込んだデータを使って解説します。
In [1]: import pandas as pd
In [2]: df = pd.read_csv('sample_index.csv')
In [3]: df
Out[3]:
age gender name state
0 17 M Tarou Tokyo
1 18 F Hanako Osaka
2 18 M Kakeru Osaka
3 17 F Manaka Nagoya
4 19 M Tomoki Chiba
5 17 F Rin Hakata
ではstate
をインデックスにしてみましょう。
In [4]: df.set_index('state')
Out[4]:
age gender name
state
Tokyo 17 M Tarou
Osaka 18 F Hanako
Osaka 18 M Kakeru
Nagoya 17 F Manaka
Chiba 19 M Tomoki
Hakata 17 F Rin
複数指定するとMultiIndexになります。
In [10]: df.set_index(["state", "age"])
Out[10]:
gender name
state age
Tokyo 17 M Tarou
Osaka 18 F Hanako
18 M Kakeru
Nagoya 17 F Manaka
Chiba 19 M Tomoki
Hakata 17 F Rin
drop=False
にすると、インデックスに使われた列データが削除されずに残ります。state
がインデックスになっていますが、列データにも残っていることが確認できます。
In [11]: df.set_index('state',drop=False)
Out[11]:
age gender name state
state
Tokyo 17 M Tarou Tokyo
Osaka 18 F Hanako Osaka
Osaka 18 M Kakeru Osaka
Nagoya 17 F Manaka Nagoya
Chiba 19 M Tomoki Chiba
Hakata 17 F Rin Hakata
append=True
にしておけば、既存のインデックスに加わる形でMultiIndexが生成されます。
In [12]: df.set_index('state',append=True)
Out[12]:
age gender name
state
0 Tokyo 17 M Tarou
1 Osaka 18 F Hanako
2 Osaka 18 M Kakeru
3 Nagoya 17 F Manaka
4 Chiba 19 M Tomoki
5 Hakata 17 F Rin
In [13]: a = df.set_index('state')
In [14]: a.set_index('gender',append=True)
Out[14]:
age name
state gender
Tokyo M 17 Tarou
Osaka F 18 Hanako
M 18 Kakeru
Nagoya F 17 Manaka
Chiba M 19 Tomoki
Hakata F 17 Rin
inplace=True
にすると元のDataFrameに変更が反映されます。破壊的な操作なので注意してください。
In [15]: df.set_index('state',inplace=True)
In [16]: df
Out[16]:
age gender name
state
Tokyo 17 M Tarou
Osaka 18 F Hanako
Osaka 18 M Kakeru
Nagoya 17 F Manaka
Chiba 19 M Tomoki
Hakata 17 F Rin
verify_integrity=True
にするとインデックスに使われる列データに被り値が存在した場合、エラーを返すようになります。
In [19]: df.set_index('age',verify_integrity=True)
--------------------------------------------------------------------------
(エラーメッセージが表示される)
ValueError: Index has duplicate keys: Int64Index([18, 17], dtype='int64', name='age')
まとめ
この記事では、PandasにおけるIndexの設定方法について解説しました。
Indexは直感的に操作しにくい部分なのでこのあたりの関数を抑えておくだけでPandasでのデータ処理が楽になると思うので是非マスターしましょう。