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

では実際のコードで使い方を見ていきます。以下のファイルを読み込んだデータを使って解説します。

sample_index.csv

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でのデータ処理が楽になると思うので是非マスターしましょう。

参考