MultiIndexって?
これがうっとうしくて、解除方法を調べたので。
【解除方法】
dfの列名あるいは行名に対して上書きする。以下に2通り示す。
#Indexの場合
df.index = df.index.get_level_values(0)
df.index = df.index.droplevel(1)
#Columnの場合
df.columns = df.columns.get_level_values(0)
df.columns = df.columns.droplevel(1)
.get_level_values( )の括弧の中の数字は、MultiIndexの残したい階層を指定する。一番上の階層が0、下の階層が順に1, 2, 3, ...になる。
.droplevel( )の括弧の中の数字は、MultiIndexの落としたい階層を指定する。[0, 1]のような形で複数落とせる。
実行例
1番目の階層を残す。
df.columns = df.columns.get_level_values(0)
#df.columns = df.columns.droplevel(1)
df
2番目の階層を残す。
df.columns = df.columns.get_level_values(1)
#df.columns = df.columns.droplevel(0)
df
ちなみに、MultiIndexを取得するとこんな感じで出力される。
df.index.get_level_values
【MultiIndexを指定する方法】
冒頭で示したMultiIndexをもつDataFrameの作成方法を記す。
- DataFrameの
index/columnsに対してMultiIndexオブジェクトを適用する - DataFrameの
index/columnsに対して配列を適用する
1. MultiIndexオブジェクトを適用する
MultiIndexオブジェクトは、pd.MultiIndex.from_tuples()で生成する。
#配列の生成
arrays = [
["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
["one", "two", "one", "two", "one", "two", "one", "two"],
]
#MultiIndexオブジェクトの生成
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])
index
MultiIndexオブジェクトの場合、階層に名前を指定できる。上記の例では、first, secondが指定されている。
これを用いて、DataFrameを作成すると以下のようになる。
df = pd.DataFrame(np.random.randn(8, 4), index=index)
df
columnsに指定するとこんな感じ。
df2 = pd.DataFrame(np.random.randn(3, 8), index=["A", "B", "C"], columns=index)
df2
2. 配列を適用する
配列をそのまま適用することもできる。この場合、階層に名前を指定できない。
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
df
df2 = pd.DataFrame(np.random.randn(3, 8), index=["A", "B", "C"], columns=arrays)
df2








