2
1

MultiIndexの解除と設定方法(pandas)

Last updated at Posted at 2024-02-19

MultiIndexって?

MultiIndexとはこんな感じのやつです。
image.png

これがうっとうしくて、解除方法を調べたので。

【解除方法】

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

image.png

2番目の階層を残す。

df.columns = df.columns.get_level_values(1)
#df.columns = df.columns.droplevel(0)
df

image.png

ちなみに、MultiIndexを取得するとこんな感じで出力される。

df.index.get_level_values

image.png

【MultiIndexを指定する方法】

冒頭で示したMultiIndexをもつDataFrameの作成方法を記す。

  1. DataFrameのindex/columnsに対してMultiIndexオブジェクトを適用する
  2. 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

image.png

MultiIndexオブジェクトの場合、階層に名前を指定できる。上記の例では、first, secondが指定されている。

これを用いて、DataFrameを作成すると以下のようになる。

df = pd.DataFrame(np.random.randn(8, 4), index=index)
df

image.png

columnsに指定するとこんな感じ。

df2 = pd.DataFrame(np.random.randn(3, 8), index=["A", "B", "C"], columns=index)
df2

image.png

2. 配列を適用する

配列をそのまま適用することもできる。この場合、階層に名前を指定できない。

df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
df

image.png

df2 = pd.DataFrame(np.random.randn(3, 8), index=["A", "B", "C"], columns=arrays)
df2

image.png

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1