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