インデックスをリセットする際は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
を使ってみます。
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_level
とcol_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