【Pandas DataFrame】インデックスの変更・振り直し・削除 [rename, reset_index]

 ※ 本記事は広告・プロモーションを含みます。
Pandas

たっきん(Twitter)です!

今回は、DataFrameインデックス(行ラベル)変更・振り直し・削除する操作方法について説明していきます。

DataFrameを扱う以上、インデックス操作する機会はかなり多いと思いますので、ここでしっかり学習していきましょう!

DataFrameを生成する際にインデックスを指定しなかった場合、デフォルトで「0, 1, 2,・・・」のような連番がインデックスに設定されています。

ohlc_data = [
    ["2020/4/1", 107.607, 117.952, 96.929, 107.191],
    ["2020/4/2", 107.191, 118.104, 97.028, 107.922],
    ["2020/4/3", 107.922, 118.688, 97.811, 108.578],
    ["2020/4/4", 108.432, 119.393, 98.403, 109.252],
    ["2020/4/5", 109.252, 119.294, 98.680, 108.799]
]

# インデックスなしのDataFrameを生成
df = pd.DataFrame(
    ohlc_data,
    columns=["datetime", "open", "high", "low", "close"]
)
print(df)
"""
   datetime     open     high     low    close
0  2020/4/1  107.607  117.952  96.929  107.191
1  2020/4/2  107.191  118.104  97.028  107.922
2  2020/4/3  107.922  118.688  97.811  108.578
3  2020/4/4  108.432  119.393  98.403  109.252
4  2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを確認
print(df.index.to_list())
"""
[0, 1, 2, 3, 4]
"""

まずはインデックス操作の基本中の基本となるインデックスの設定から説明をし、その後にインデックスの変更、振り直し、削除する操作方法について、サンプルコード使って1つずつ説明していきます。

Pandasに関する記事を多数書いてます

インデックスの設定

インデックスを設定するにはDataFrame.set_index()を使用します。

インデックス設定後のDataFrameは返り値で返され、元データは変更されません。

インデックスを設定するサンプルコードを用意したので動作を順を追って確認してみましょう!

サンプルコードは下図のような時系列OHLCデータの「datetime」列をインデックスとして設定する例になります。

# 元データの中身を確認
print(df)
"""
   datetime     open     high     low    close
0  2020/4/1  107.607  117.952  96.929  107.191
1  2020/4/2  107.191  118.104  97.028  107.922
2  2020/4/3  107.922  118.688  97.811  108.578
3  2020/4/4  108.432  119.393  98.403  109.252
4  2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを確認
print(df.index.to_list())
"""
[0, 1, 2, 3, 4]
"""

# インデックスに"datetime"を設定
df_i = df.set_index("datetime")

# DataFrameの中身を確認
print(df_i)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを確認
print(df_i.index.to_list())
"""
['2020/4/1', '2020/4/2', '2020/4/3', '2020/4/4', '2020/4/5']
"""

# 元データは変更されていない
print(df)
"""
   datetime     open     high     low    close
0  2020/4/1  107.607  117.952  96.929  107.191
1  2020/4/2  107.191  118.104  97.028  107.922
2  2020/4/3  107.922  118.688  97.811  108.578
3  2020/4/4  108.432  119.393  98.403  109.252
4  2020/4/5  109.252  119.294  98.680  108.799
"""

インデックス設定後のDataFrameを返り値で受け取るのではなく、元データを変更したい場合があると思います。

その場合は引数に(inplace=True)を指定します。

# 元データの中身を確認
print(df)
"""
   datetime     open     high     low    close
0  2020/4/1  107.607  117.952  96.929  107.191
1  2020/4/2  107.191  118.104  97.028  107.922
2  2020/4/3  107.922  118.688  97.811  108.578
3  2020/4/4  108.432  119.393  98.403  109.252
4  2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスに"datetime"を設定
# (inplace=True)で元データを変更
df.set_index("datetime", inplace=True)

# 元データの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

インデックスの変更

インデックスを変更するにはDataFrame.rename()を使用します。

変更したいインデックスは辞書型で指定し、引数でindex = { 元の値: 変更後の値 }のように記述します。

また、変更したいインデックスは,で区切ることで次のように複数個指定することもできます。

 ・index = { 元の値①: 変更後の値①, 元の値②: 変更後の値② }

インデックス変更後のDataFrameは返り値で返され、元データは変更されません。

こちらもサンプルコードを使って動作を確認していきましょう!

次のように2つのインデックスを変更する例になります。

  • 2020/4/2 → aaaaaaaa
  • 2020/4/4 → bbbbbbbb
# DataFrameの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを2つ変更
index_mapper = {
    "2020/4/2": "aaaaaaaa",
    "2020/4/4": "bbbbbbbb"
}
df_i = df.rename(index=index_mapper)

# 変更後データの中身を確認
print(df_i)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
aaaaaaaa  107.191  118.104  97.028  107.922  <- インデックス変更
2020/4/3  107.922  118.688  97.811  108.578
bbbbbbbb  108.432  119.393  98.403  109.252  <- インデックス変更
2020/4/5  109.252  119.294  98.680  108.799
"""

set_index()と同様に、変更後のDataFrameを返り値で受け取るのではなく、元データを変更したい場合は引数に(inplace=True)を指定します。

# 元データの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを2つ変更
# (inplace=True)で元データを変更
index_mapper = {
    "2020/4/2": "aaaaaaaa",
    "2020/4/4": "bbbbbbbb"
}
df.rename(index=index_mapper, inplace=True)

# 元データの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
aaaaaaaa  107.191  118.104  97.028  107.922  <- インデックス変更
2020/4/3  107.922  118.688  97.811  108.578
bbbbbbbb  108.432  119.393  98.403  109.252  <- インデックス変更
2020/4/5  109.252  119.294  98.680  108.799
"""

インデックスの振り直し

インデックスを振り直すにはDataFrame.reset_index()を使用します。

DataFrame.reset_index()を実行すると、元のインデックスが列データに追加され、新しく「0, 1, 2,・・・」のような連番がデフォルト・インデックスとして設定されます。

下図のように「datetime」がインデックスに設定されているDataFrameからインデックスを振り直すサンプルコードで動作を確認していきましょう!

# 元データの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを確認
print(df.index.to_list())
"""
['2020/4/1', '2020/4/2', '2020/4/3', '2020/4/4', '2020/4/5']
"""

# インデックスの振り直し
df_i = df.reset_index()

# 振り直し後データの中身を確認
print(df_i)
"""
   datetime     open     high     low    close
0  2020/4/1  107.607  117.952  96.929  107.191
1  2020/4/2  107.191  118.104  97.028  107.922
2  2020/4/3  107.922  118.688  97.811  108.578
3  2020/4/4  108.432  119.393  98.403  109.252
4  2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを確認
print(df_i.index.to_list())
"""
[0, 1, 2, 3, 4]
"""

set_index()と同様に、変更後のDataFrameを返り値で受け取るのではなく、元データを変更したい場合は引数に(inplace=True)を指定します。

# 元データの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスの振り直し
# (inplace=True)で元データを変更
df.reset_index(inplace=True)

# 元データの中身を確認
print(df)
"""
   datetime     open     high     low    close
0  2020/4/1  107.607  117.952  96.929  107.191
1  2020/4/2  107.191  118.104  97.028  107.922
2  2020/4/3  107.922  118.688  97.811  108.578
3  2020/4/4  108.432  119.393  98.403  109.252
4  2020/4/5  109.252  119.294  98.680  108.799
"""

インデックスの削除

インデックスを削除するにはDataFrame.reset_index()の引数に(drop=True)を使用します。

DataFrame.reset_index(drop=True)を実行すると、元のインデックスが削除されて、新しく「0, 1, 2,・・・」のような連番がデフォルト・インデックスとして設定されます。

下図のように「datetime」がインデックスに設定されているDataFrameからインデックスを削除するサンプルコードで動作を確認していきましょう!

# 元データの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスを確認
print(df.index.to_list())
"""
['2020/4/1', '2020/4/2', '2020/4/3', '2020/4/4', '2020/4/5']
"""

# インデックスの削除
df_i = df.reset_index(drop=True)

# 削除後データの中身を確認
print(df_i)
"""
      open     high     low    close
0  107.607  117.952  96.929  107.191
1  107.191  118.104  97.028  107.922
2  107.922  118.688  97.811  108.578
3  108.432  119.393  98.403  109.252
4  109.252  119.294  98.680  108.799
"""

# インデックスを確認
print(df_i.index.to_list())
"""
[0, 1, 2, 3, 4]
"""

set_index()と同様に、変更後のDataFrameを返り値で受け取るのではなく、元データを変更したい場合は引数に(inplace=True)を指定します。

# 元データの中身を確認
print(df)
"""
             open     high     low    close
datetime                                   
2020/4/1  107.607  117.952  96.929  107.191
2020/4/2  107.191  118.104  97.028  107.922
2020/4/3  107.922  118.688  97.811  108.578
2020/4/4  108.432  119.393  98.403  109.252
2020/4/5  109.252  119.294  98.680  108.799
"""

# インデックスの振り直し
# (inplace=True)で元データを変更
df.reset_index(inplace=True)

# 元データの中身を確認
print(df)
"""
      open     high     low    close
0  107.607  117.952  96.929  107.191
1  107.191  118.104  97.028  107.922
2  107.922  118.688  97.811  108.578
3  108.432  119.393  98.403  109.252
4  109.252  119.294  98.680  108.799
"""

参考

スポンサーリンク

コメント

タイトルとURLをコピーしました