はてだBlog(仮称)

私的なブログど真ん中のつもりでしたが、気づけばWebサイト系のアプリケーション開発周りで感じたこと寄りの自分メモなどをつれづれ述べています。2020年6月現在、Elasticsearch、pandas、CMSなどに関する話題が多めです。...ですが、だんだんとより私的なプログラムのスニペット置き場になりつつあります。ブログで述べている内容は所属組織で販売している製品などに関するものではなく、また所属する組織の見解を代表するものではありません。

Pandas MultiIndexのオペレーションメモ

Pandasでgroupbyなどの際に思わず発生するMultiIndex。

いやもちろん、思わず...ではなくて正規の仕様なのですが、しばらく間が空くと少し勘を取り戻すのに苦労する仕様な気がします。

まあ間が空いていても空いてなくても、私の場合、reset_index()してしまうのですが、そんな時に自らをかえりみるための、MultiIndexまわりの関数・スニペットメモです。

全部入り

f:id:azotar:20200225214208p:plain


# リネーム(実際は代入してください)

df.rename_axis(index={'mon': 'M'})

df.index.rename(['Y', 'M', 'W'])


# swaplevel(入れ替え)

df.index.swaplevel('year', 'mon')

df.index.swaplevel(0,1)

# マルチインデックスから削除
df.index.droplevel('mon')  # dfにもdroplevelがある。

# indexの値の変更
df.rename(index={2019:'19',2020:'20'},level='year')  

# reset_index
df.reset_index('year')

ひとつずつ

サンプルデータ

In [204]: df                                                                                                                                 
Out[204]: 
               num
year mon week     
2019 12  4       8
2020 1   1      38
         2      32
         3      10
         4      22
     2   1      10
         2      15

typeを確認

In [205]: type(df.index)                                                                                                                              
Out[205]: pandas.core.indexes.multi.MultiIndex

locで取得

In [206]: df.loc[(2019)]                                                                                                                               
Out[206]: 
          num
mon week     
12  4       8

値の確認

In [207]:df.index.names                                                                                                                     
Out[207]: FrozenList(['year', 'mon', 'week'])

リネーム(実際は代入してください)

In [208]: df.rename_axis(index={'mon': 'M'})                                                                                                                       
Out[208]: 
              num
year M  week     
2019 12 4       8
2020 1  1      38
        2      32
        3      10
        4      22
     2  1      10
        2      15


In [209]: df.index.rename(['Y', 'M', 'W'])                                                                                                   
Out[209]: 
MultiIndex([(2019, 12, 4),
            (2020,  1, 1),
            (2020,  1, 2),
            (2020,  1, 3),
            (2020,  1, 4),
            (2020,  2, 1),
            (2020,  2, 2)],
           names=['Y', 'M', 'W'])

swaplevel(入れ替え)

 In [210]: df.index.swaplevel('year', 'mon')                                                                                                  
Out[210]: 
MultiIndex([(12, 2019, 4),
            ( 1, 2020, 1),
            ( 1, 2020, 2),
            ( 1, 2020, 3),
            ( 1, 2020, 4),
            ( 2, 2020, 1),
            ( 2, 2020, 2)],
           names=['mon', 'year', 'week'])

In [211]: df.index.swaplevel(0,1) 
Out[211]: 
MultiIndex([(12, 2019, 4),
            ( 1, 2020, 1),
            ( 1, 2020, 2),
            ( 1, 2020, 3),
            ( 1, 2020, 4),
            ( 2, 2020, 1),
            ( 2, 2020, 2)],
           names=['mon', 'year', 'week'])

マルチインデックスから削除

In [212]:df.index.droplevel('mon')  # dfにもdroplevelがある。                                                                               
Out[212]: 
MultiIndex([(2019, 4),
            (2020, 1),
            (2020, 2),
            (2020, 3),
            (2020, 4),
            (2020, 1),
            (2020, 2)],
           names=['year', 'week'])

indexの値の変更

In [213]:  df.rename(index={2019:'19',2020:'20'},level='year')                                                                                
Out[213]: 
               num
year mon week     
19   12  4       8
20   1   1      38
         2      32
         3      10
         4      22
     2   1      10
         2      15

reset_index

In [214]: df.reset_index('year')                                                                                                                             
Out[214]: 
          year  num
mon week           
12  4     2019    8
1   1     2020   38
    2     2020   32
    3     2020   10
    4     2020   22
2   1     2020   10
    2     2020   15

リンク

MultiIndex

pandas.pydata.org

CookbookのMultiIndex関連

Cookbook — pandas 1.0.1 documentation

関連別記事

itdepends.hateblo.jp