インデックスをリセットする際はreset_index関数を使います。

set_index等でインデックスを設定した後に、インデックスを連番に戻したいときに使ってください。set_index関数については以下の記事を参考にしてください。

PandasでIndexオブジェクトを設定するset_index関数の使い方 /features/pandas-setindex.html

インデックスをリセットする

reset_index関数

インデックスをリセットする方法です。これにはreset_index関数を使います。reset_index関数のAPIドキュメントは以下のとおりです。

pandas.DataFrame.reset_index(level=None,drop=False,inplace=False,col_level=0)

params:

パラメータ名 概要
level int,文字列,タプル
リストまたはNone
初期値 None
MultiIndexのとき、特定の階層のIndexオブジェクトだけ取り除きます。
drop bool値 初期値 False
drop=Trueにすると、削除されたIndexオブジェクトの値を列データに挿入しません。デフォルトでは挿入します。
inplace bool値 初期値 False
元のデータフレームに操作を反映するかどうか指定します。
col_level intまたは文字列 初期値 0
カラムのラベルがMultiIndexだった場合、どの階層に挿入するかを指定します。
col_fill object 初期値 ‘‘
カラムが多階層であったとき、カラムが挿入される階層以外における列データのカラムラベルを指定します。

returns:

indexがリセットされたDataFrameが返されます。

インデックスラベルやカラムラベルがMultiIndexオブジェクト(Indexオブジェクトが多階層になっている)ときに設定できるように引数が増えていますが特に指定せずに使うケースが多いと思います。

1つ1つ使い方を見ていきましょう。

まずはデータを準備しましょう。以下のcsvを読み込んで、set_indexを使ってインデックスを設定した後に、reset_indexを使ってみます。

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

In [4]: df = df.set_index('state')

In [5]: df
Out[5]:
        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

In [6]: df.reset_index() # 多階層でないとき
Out[6]:
    state  age gender    name
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

drop=Trueにするとstateのデータが失われます。

In [7]: df.reset_index(drop=True)
Out[7]:
   age gender    name
0   17      M   Tarou
1   18      F  Hanako
2   18      M  Kakeru
3   17      F  Manaka
4   19      M  Tomoki
5   17      F     Rin

MultiIndexのデータでやってみます。まずはインデックスラベルがMultiIndexのときです。

In [8]: multi_ind = df.set_index('gender',append=True)

In [9]: multi_ind
Out[9]:
               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

特に引数を指定しないと、state,genderのどちらもが列データに戻されます。

In [10]: multi_ind.reset_index()
Out[10]:
    state gender  age    name
0   Tokyo      M   17   Tarou
1   Osaka      F   18  Hanako
2   Osaka      M   18  Kakeru
3  Nagoya      F   17  Manaka
4   Chiba      M   19  Tomoki
5  Hakata      F   17     Rin

genderだけ戻してみましょう。level='gender'とするかlevel=1とすれば指定できます。

In [11]: multi_ind.reset_index(level='gender')
Out[11]:
       gender  age    name
state                     
Tokyo       M   17   Tarou
Osaka       F   18  Hanako
Osaka       M   18  Kakeru
Nagoya      F   17  Manaka
Chiba       M   19  Tomoki
Hakata      F   17     Rin

In [12]: multi_ind.reset_index(level=1)
Out[12]:
       gender  age    name
state                     
Tokyo       M   17   Tarou
Osaka       F   18  Hanako
Osaka       M   18  Kakeru
Nagoya      F   17  Manaka
Chiba       M   19  Tomoki
Hakata      F   17     Rin

In [13]: multi_ind.reset_index(level=0) # stateのときはlevel=0になる
Out[13]:
         state  age    name
gender                     
M        Tokyo   17   Tarou
F        Osaka   18  Hanako
M        Osaka   18  Kakeru
F       Nagoya   17  Manaka
M        Chiba   19  Tomoki
F       Hakata   17     Rin

三階層にしてみます。

In [14]: triple_ind = df.set_index(['gender', 'age'],append=True)

In [15]: triple_ind
Out[15]:
                     name
state  gender age        
Tokyo  M      17    Tarou
Osaka  F      18   Hanako
       M      18   Kakeru
Nagoya F      17   Manaka
Chiba  M      19   Tomoki
Hakata F      17      Rin

複数の階層を指定してみましょう。

In [16]: triple_ind.reset_index(['state','gender'])
Out[16]:
      state gender    name
age                       
17    Tokyo      M   Tarou
18    Osaka      F  Hanako
18    Osaka      M  Kakeru
17   Nagoya      F  Manaka
19    Chiba      M  Tomoki
17   Hakata      F     Rin

inplace=Trueにすれば元のデータフレームに変更が反映されます。

In [17]: triple_ind.reset_index('state', inplace=True)

In [18]: triple_ind
Out[18]:
             state    name
gender age                
M      17    Tokyo   Tarou
F      18    Osaka  Hanako
M      18    Osaka  Kakeru
F      17   Nagoya  Manaka
M      19    Chiba  Tomoki
F      17   Hakata     Rin

col_levelcol_fillをいじるために2階層のカラムデータを作成してみましょう。
公式ドキュメントのサンプルコードを参考にします。

In [27]: index = pd.MultiIndex.from_tuples([('bird','falcon'), ('bird','parrot'), ('mammal','lion'),('mammal', 'monkey')],names=['class','name'])

In [28]: columns = pd.MultiIndex.from_tuples([('speed','max'),('species','type')])

In [30]: import numpy as np

In [31]: df = pd.DataFrame([(389.0,'fly'), (24.0,'fly'),(80.5,'run'),(np.nan,'jump')],index=index, columns=columns)

In [32]: df
Out[32]:
               speed species
                 max    type
class  name
bird   falcon  389.0     fly
       parrot   24.0     fly
mammal lion     80.5     run
       monkey    NaN    jump

平均速度も付け加えておきます。

In [34]: df[('speed', 'mean')] = [200.0, 12.0, 40.0, 15.0]

In [38]: df = df.sort_index(axis='columns',level=0)

In [39]: df
Out[39]:
              species  speed       
                 type    max   mean
class  name
bird   falcon     fly  389.0  200.0
       parrot     fly   24.0   12.0
mammal lion       run   80.5   40.0
       monkey    jump    NaN   15.0

ではインデックスのclassを移動させてみましょう。
下の階層に挿入したいのでcol_level=1とします。

In [40]: df.reset_index(level='class', col_level=1)
Out[40]:
               species  speed       
         class    type    max   mean
name                                
falcon    bird     fly  389.0  200.0
parrot    bird     fly   24.0   12.0
lion    mammal     run   80.5   40.0
monkey  mammal    jump    NaN   15.0

上の階層での分類を'species'にします。このときはcol_fillを使って指定します。


In [41]: df.reset_index(level='class',col_level=1,col_fill='species')
Out[41]:
       species        speed       
         class  type    max   mean
name                              
falcon    bird   fly  389.0  200.0
parrot    bird   fly   24.0   12.0
lion    mammal   run   80.5   40.0
monkey  mammal  jump    NaN   15.0

まとめ

今回はPandasにおけるrest_indexの使い方を紹介しました。インデックスの使い方については、以下の記事でもまとめているので参考にしてみてください。

PandasのIndexの理解と使い方まとめ /features/pandas-index.html

参考