【Pandas】カラムのマルチインデックスを解除する【Python】
MAX
MAX999blog
MultiIndexは複数の列がインデックスに指定されている状態だが、状況次第では特定の列をインデックスから除外したい場合もある。
マルチインデックスとなるデータを作成する。
1import pandas as pd
2
3# MultiIndexを持つDataFrameを作成する。
4arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
5index = pd.MultiIndex.from_arrays(arrays, names=('letters', 'numbers'))
6df = pd.DataFrame({'data': [11, 22, 33, 44]}, index=index)
7print(df)
8# data
9# letters numbers
10# A 1 11
11# 2 22
12# B 1 33
13# 2 44
インデックスにlettersとnumbersという列を指定。
numbersをインデックスから削除する。(ついでにDataFrameからも削除する)。
numbersはMultiIndexに入っているので、そのままではdropで削除できないため、reset_indexでインデックスから除外する。
reset_indexのlevelに対象のインデックス列名を指定することで、その列のみをインデックスから除外できる。
1# インデックスを解除。levelにnumbersを指定することでnumbersだけをindexから解除する。
2df_reset = df.reset_index(level='numbers')
3
4# 'numbers' 列を削除
5df_reset.drop(columns='numbers', inplace=True)
6
7print(df_reset)
8# data
9# letters
10# A 11
11# A 22
12# B 33
13# B 44
14
15# indexが1列になったので、MultiIndexではなくIndexになる。
16print(df_reset.index)
17# Index(['A', 'A', 'B', 'B'], dtype='object', name='letters')
DataFrameのインデックスには元々lettersとnumbersの2種類が設定されていたのでMultiIndexになっていたが、numbersをインデックスから削除することでインデックスがlettersだけになった。
そのため型もMultiIndexからIndexに自動的に変わる。