pandas.DataFrame, Seriesのインデックスを振り直すreset_index
pandasでDataFrame
やSeries
のインデックスindex
(行名、行ラベル)を0始まりの連番(行番号)に振り直すにはreset_index()
メソッドを使う。
- pandas.DataFrame.reset_index — pandas 2.1.4 documentation
- pandas.Series.reset_index — pandas 2.1.4 documentation
インデックスの一部を変更したり全体をリストなどで置き換えたりする方法については以下の記事を参照。
本記事のサンプルコードの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
引数drop
をTrue
とすると、元の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
デフォルトでは元のオブジェクトは変更されず、新たなオブジェクトが返される。引数inplace
をTrue
とすると元のオブジェクトが変更される。
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
がマルチレベルのときの振る舞いを指定する引数もある。詳細は公式ドキュメントを参照。