如何在多个级别上重新索引 MultiIndex Dataframe?

How to Reindex MultiIndex Dataframe on Multiple Levels?

所以我目前有以下聚合的数据框,我有一个如下所示的多索引:

Date     Country_Band      Value      Decimal
May 2021 Non-US            2-14       0.11
         US                2-14       0.22
                           1          0.33
                           15+        0.44
         Non-US            1          0.55
                           15+        0.66

我想以某种方式对这些进行组织和分组以获得以下内容:

Date     Country_Band      Value      Decimal
May 2021 US                1          0.33
                           2-14       0.22
                           15+        0.44

         Non-US            1          0.55
                           2-14       0.11
                           15+        0.66

这是一个更大数据帧的索引。我首先尝试执行以下代码:

df_march_agg = df_march_agg.reindex(['US', 'Non-US'], level='Country_Band')

这在获取国家乐队组时有效,但是该值仍然没有按数字顺序排列:

Date     Country_Band      Value      Decimal
May 2021 US                2-14       0.22
                           1          0.33 
                           15+        0.44

         Non-US            2-14       0.11
                           1          0.55
                           15+        0.66

我试过然后做同样的事情:

df_march_agg = df_march_agg.reindex(['1', '2-14', '15+'], level='Value')

但这随后取消了之前的重建索引。知道我遗漏了什么或需要添加什么才能让两者都井井有条吗?

干杯!

MultiIndex.set_levels, so possible use DataFrame.sort_index 中有序分类的一个想法:

df.index = (df.index.set_levels(pd.CategoricalIndex(df.index.levels[1], 
                                                   ordered=True,
                                                   categories=['US', 'Non-US']), 
                                                   level=1)
                    .set_levels(pd.CategoricalIndex(df.index.levels[2], 
                                                   ordered=True, 
                                                   categories=['1', '2-14', '15+']), 
                                                   level=2))

df = df.sort_index()
print (df)
                             Decimal
Date     Country_Band Value         
May 2021 US           1         0.33
                      2-14      0.22
                      15+       0.44
         Non-US       1         0.55
                      2-14      0.11
                      15+       0.66

DataFrame.reindex with MultiIndex.from_product的另一个想法:

mux = pd.MultiIndex.from_product([['May 2021'],
                                  ['US', 'Non-US'],
                                  ['1', '2-14', '15+']], 
                                  names=['Date','Country_Band','Value'])

df = df.reindex(mux)
print (df)
                             Decimal
Date     Country_Band Value         
May 2021 US           1         0.33
                      2-14      0.22
                      15+       0.44
         Non-US       1         0.55
                      2-14      0.11
                      15+       0.66