pandasのMultiindexを整理する
この記事はなにか
こういうデータフレームを
こういう形にしたい。
以下の記事の「集約」という節でpandasのMultiindexをもとの形式に戻すやり方を書いたがもうちょっとわかりやすい方法があったのでメモ。ただし、メソッドチェーンで完結していない。
以下のようなflightsデータで考える。
これを集約してはじめに載せた以下のようなMultiindexにする
airline_info = flights.groupby(['AIRLINE', 'WEEKDAY'])\ .agg({'DIST':['sum','mean'], 'ARR_DELAY':['min','max']})\ .astype(int) airline_info.head()
列の対処
列について、各列毎の集約関数列が入っている。これを列名_集約関数名
という列名にまとめたい。
カラム情報をみると階層的なデータの持ち方になっている。
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()
行の対処
これはreset_index()
を用いることでindexを初期値に貼り直すことができる。
airline_info.reset_index().head()