pandas.DataFrame, Seriesのインデックスを振り直すreset_index

Modified: | Tags: Python, pandas

pandasでDataFrameSeriesのインデックスindex(行名、行ラベル)を0始まりの連番(行番号)に振り直すにはreset_index()メソッドを使う。

インデックスの一部を変更したり全体をリストなどで置き換えたりする方法については以下の記事を参照。

本記事のサンプルコードのpandasのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。

import pandas as pd

print(pd.__version__)
# 2.1.4

reset_index()でインデックスを連番に振り直し

例として以下のデータを使用する。

df = pd.read_csv('data/src/sample_pandas_normal.csv').sort_values('state')
print(df)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

説明のためsort_values()で行を並べ替えている。

例はDataFrameだが、Seriesにもreset_index()が用意されている。引数など、使い方はどちらも同じ。

基本的な使い方

ソートしてばらばらになったindexを0始まりの連番に振り直す。

引数に何も指定せずreset_index()を使うと、0始まりの連番が新たなindexとなり、元のindexがデータ列として残る。

print(df.reset_index())
#    index     name  age state  point
# 0      1      Bob   42    CA     92
# 1      2  Charlie   18    CA     70
# 2      4    Ellen   24    CA     88
# 3      0    Alice   24    NY     64
# 4      5    Frank   30    NY     57
# 5      3     Dave   68    TX     70

元のindexを削除: 引数drop

引数dropTrueとすると、元のindexは削除され残らない。

print(df.reset_index(drop=True))
#       name  age state  point
# 0      Bob   42    CA     92
# 1  Charlie   18    CA     70
# 2    Ellen   24    CA     88
# 3    Alice   24    NY     64
# 4    Frank   30    NY     57
# 5     Dave   68    TX     70

元のオブジェクトを変更: 引数inplace

デフォルトでは元のオブジェクトは変更されず、新たなオブジェクトが返される。引数inplaceTrueとすると元のオブジェクトが変更される。

df.reset_index(inplace=True, drop=True)
print(df)
#       name  age state  point
# 0      Bob   42    CA     92
# 1  Charlie   18    CA     70
# 2    Ellen   24    CA     88
# 3    Alice   24    NY     64
# 4    Frank   30    NY     57
# 5     Dave   68    TX     70

reset_index()とset_index()でインデックスを別の列に変更(再設定)

インデックスとして番号ではなく行名が設定されている場合を例とする。

df_name = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df_name)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

reset_index()メソッドを使うと、連番がインデックスに設定され元のインデックスがデータ列に追加される。

print(df_name.reset_index())
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

別の列をインデックスに変更(再設定)するためにはset_index()メソッドを使う。

元のDataFrameにそのままset_index()を適用すると元のインデックスは削除される。

print(df_name.set_index('state'))
#        age  point
# state            
# NY      24     64
# CA      42     92
# CA      18     70
# TX      68     70
# CA      24     88
# NY      30     57

元のインデックスをデータ列として残すには、reset_index()してからset_index()を用いればよい。

print(df_name.reset_index().set_index('state'))
#           name  age  point
# state                     
# NY       Alice   24     64
# CA         Bob   42     92
# CA     Charlie   18     70
# TX        Dave   68     70
# CA       Ellen   24     88
# NY       Frank   30     57

なお、便宜上、この例では重複する値を持つ列をインデックスとして設定しているが、インデックスの値は重複しない(それぞれの値がユニークである)ほうがデータ選択などはしやすい。

マルチインデックスに対するreset_index()

pandasでは、複数の列を階層的にインデックスとするマルチインデックスを設定できる。

df_mi = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=(2, 0))
print(df_mi)
#                age  point
# state name               
# NY    Alice     24     64
# CA    Bob       42     92
#       Charlie   18     70
# TX    Dave      68     70
# CA    Ellen     24     88
# NY    Frank     30     57

マルチインデックスの場合、デフォルトでreset_index()はすべてのインデックスをリセットする。

print(df_mi.reset_index())
#   state     name  age  point
# 0    NY    Alice   24     64
# 1    CA      Bob   42     92
# 2    CA  Charlie   18     70
# 3    TX     Dave   68     70
# 4    CA    Ellen   24     88
# 5    NY    Frank   30     57

引数levelにリセットするインデックスを指定可能。

print(df_mi.reset_index(level='state'))
#         state  age  point
# name                     
# Alice      NY   24     64
# Bob        CA   42     92
# Charlie    CA   18     70
# Dave       TX   68     70
# Ellen      CA   24     88
# Frank      NY   30     57

なお、reset_index()には列名columnsがマルチレベルのときの振る舞いを指定する引数もある。詳細は公式ドキュメントを参照。

関連カテゴリー

関連記事