LoginSignup
8
11

More than 1 year has passed since last update.

Python>pandas>DataFrame:マルチインデックス・マルチカラム構造のDataFrameの操作

Last updated at Posted at 2021-09-04

1.概要

groupbyメソッドを使ってデータをまとめると、マルチインデックスを持ったDataFrameのデータが出てくることがよくあるが、マルチインデックスのデータの取り扱いになれていなく操作がわからなくなることが多発。そこでいったん自分なりに整理した。

2.マルチインデックス・マルチカラムのDataFrame準備

  • サンプルデータ+groupby+aggメソッド
    カラム(col1,col2,col3)ごとに合計値(sum)、最大値(max)、最小値(min)をまとめる。
     ⇒マルチインデックスとマルチカラムをもつDataFrame
df = pd.DataFrame({'col1':['a','b','c','a','a','b','b','b','c','a'],
                   'col2':['A','A','A','A','A','B','B','B','B','B'],
                   'col3':['AA','AA','BB','BB','AA','AA','BB','BB','CC','CC'],
                   'val1':np.arange(11,21),
                   'val2':np.arange(21,31)})

grouped = df.groupby(['col1','col2','col3'])
df_multi = grouped.agg([sum,max,min])
df_multi

image.png

3.マルチインデックスの操作

  • マルチインデックスの操作として、以下を確認。
    • マルチインデックスの解除・再マルチインデックス化
    • レベルの変更・並び替え

3.1.マルチインデックスの解除

df_multi_reset = df_multi.reset_index()
df_multi_reset

image.png

<マルチインデックスに戻す>
* 以下を実行すればOK。

df_multi_reset.set_index(['col1','col2','col3'])

<カラムのマルチ構造を解除?>
* シンプルなコマンドでマルチカラムを解除する方法は見つけられず。。
 転置してマルチインデックスと同様の操作をできるようにするか、タプルにするか。。?

<転置する>

df_multi.T

image.png
転置すればマルチインデックス(行)と同じ操作ができる。

<タプルにする>

df_multi_tplc  = df_multi.copy()
df_multi_tplc.columns = df_multi_tplc.columns.values
df_multi_tplc

image.png

タプルにすると、シングルカラムと同様に列を選んだりできる。

df_multi_tplc[[('val1', 'sum'),('val2', 'max'),]]

※注'(val1, sum)'でなく('val1', 'sum')になる。
image.png

タプルからマルチカラムにもどすコードは以下の通り。

df_multi_tplc.columns = pd.MultiIndex.from_tuples(df_multi_tplc.columns)
df_multi_tplc

columnsindexに置き換えれば行についても同様のことができる。

3.2.並び替え

行・列のレベルの入れ替えとレベルごとのデータ並び替えをして、データのまとまりを編集する。

image.png

3.2.1.マルチインデックスのレベル入れ替え&ソート

  • df_multiの列はcol1内のまとまり→col2のまとまり→col3のまとまりというような階層構造になっている。これを逆の構造にする。

image.png

df_multi.swaplevel(0,2,axis=0).sort_index(axis=0)

image.png

axis=1を書かずに、df_multi.swaplevel(0,2).sort_index()としてもよい、

3.2.2.マルチカラムのレベル入れ替え&ソート

マルチカラムでも同様のことができる。

df_multi.swaplevel(0,1,axis=1).sort_index(axis=1)

image.png

4.要素、DataFrameの抽出

以下の赤枠の要素、青枠のDataFrameの抽出をする。

image.png

4.1.赤枠要素の抽出

赤枠の「14」は、以下2通りで抽出可能。

df_multi.loc[('a','A','BB'),('val1','min')]

マルチカラム、インデックスを無視して1行2列を抽出するとしてもOK。(左上端0行0列)

df_multi.iloc[1,2]

4.2.青枠の部分DataFrameの抽出

青枠部分は以下で抽出できる。

df_multi.loc[('b','B'),('val2')]

image.png

5.マルチインデックスDataFrameのデータ編集

マルチインデックスDataFrameのデータ追加・削除をする。

5.1.データの入力・更新

df_multi_edit =df_multi.copy()
df_multi_edit.loc[('d','D','DD')]=[1,2,3,4,5,6] # (1)行の追加
df_multi_edit.loc[:,('val3','sum')]=[1,2,3,4,5,6,7,8,9] # (2)列の追加
df_multi_edit.loc[('a','A','AA'),('val1','sum')]=100 # (3)値の書き換え

image.png

5.2.行・列の削除

df_multi_edit.drop(('val2'),axis=1,inplace=True) #val2列の削除
df_multi_edit.drop(('c','A','BB'),axis=0,inplace=True) #('c','A','BB')行の削除
df_multi_edit

image.png

5.3.データの結合

結合させるデータの準備

df_vol4 = pd.DataFrame({('vol4','a'):range(31,40),
             ('vol4','b'):np.arange(49,40,-1)},
             index= [('a', 'A', 'AA'),('a', 'A', 'BB'),('a', 'B', 'CC'), ('b', 'A', 'AA'),
                     ('b', 'B', 'AA'),('b', 'B', 'BB'),('c', 'A', 'BB'),('c', 'B', 'CC'),('d', 'D', 'DD')
                    ])
df_vol4.index = pd.MultiIndex.from_tuples(df_add.index,names=['col1','col2','col3'])
df_vol4.columns = pd.MultiIndex.from_tuples(df_add.columns)
df_vol4     

image.png

pd.merge(df_multi_edit,df_vol4,on=('col1','col2','col3'),how ='outer')

image.png

6.参照資料

以下の資料を勉強しながら記事を書きました。

3.1.マルチインデックスの解除

3.2.並び替え

以上

8
11
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
8
11