たっきん(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記事全容(目次)になります。
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
"""
参考
- 【API reference】pandas.DataFrame.set_index
- 【API reference】pandas.DataFrame.rename
- 【API reference】pandas.DataFrame.reset_index
コメント