まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

pandasのMultiindexを整理する

この記事はなにか

f:id:chito_ng:20200103154123p:plain

こういうデータフレームを

f:id:chito_ng:20200103154200p:plain

こういう形にしたい。

以下の記事の「集約」という節でpandasのMultiindexをもとの形式に戻すやり方を書いたがもうちょっとわかりやすい方法があったのでメモ。ただし、メソッドチェーンで完結していない。

knknkn.hatenablog.com

以下のようなflightsデータで考える。 f:id:chito_ng:20200103154400p:plain

これを集約してはじめに載せた以下のようなMultiindexにする

airline_info = flights.groupby(['AIRLINE', 'WEEKDAY'])\
                      .agg({'DIST':['sum','mean'],
                            'ARR_DELAY':['min','max']})\
                      .astype(int)

airline_info.head()

f:id:chito_ng:20200103154123p:plain

列の対処

列について、各列毎の集約関数列が入っている。これを列名_集約関数名という列名にまとめたい。

カラム情報をみると階層的なデータの持ち方になっている。

airline_info.columns

#MultiIndex(levels=[['DIST', 'ARR_DELAY'], ['max', 'mean', 'min', 'sum']],
#           codes=[[0, 0, 1, 1], [3, 1, 2, 0]])

これは、get_level_values()を用いることで指定したlevelのindexを取得できる。

level0 = airline_info.columns.get_level_values(0)
# Index(['DIST', 'DIST', 'ARR_DELAY', 'ARR_DELAY'], dtype='object')

level1 = airline_info.columns.get_level_values(1)
# Index(['sum', 'mean', 'min', 'max'], dtype='object')

そのため、これらの情報を用いることで列名を変更すると列部分を列名_集約関数名にすることができる。

airline_info.columns = level0 + '_' + level1

airline_info.head()

f:id:chito_ng:20200103155100p:plain

行の対処

これはreset_index()を用いることでindexを初期値に貼り直すことができる。

airline_info.reset_index().head()

f:id:chito_ng:20200103154200p:plain