使用`.loc`访问多索引数据框时如何保留列顺序?

时间:2018-12-30 21:42:42

标签: python pandas multi-index

让我们为以下具有多索引列的数据框

import numpy as np
import pandas as pd 

a = ['i', 'ii']
b = list('abc')
mi = pd.MultiIndex.from_product([a,b])
df = pd.DataFrame(np.arange(100,100+len(mi)*3).reshape([-1,len(mi)]), 
                  columns=mi)
print(df)
#     i             ii
#     a    b    c    a    b    c
# 0  100  101  102  103  104  105
# 1  106  107  108  109  110  111
# 2  112  113  114  115  116  117

我使用.loc[]pd.IndexSlice尝试以这种顺序选择列'c''b'

idx = pd.IndexSlice
df.loc[:, idx[:, ['c','b']]]

但是,如果我查看输出,则不遵守请求的排序!

#     i        ii
#     b    c    b    c
# 0  101  102  104  105
# 1  107  108  110  111
# 2  113  114  116  117

这是我的问题:

  1. 为什么熊猫不保留订单?我认为这很危险,因为列表['c', 'b']表示从用户角度进行排序。
  2. 如何在保留顺序的同时通过loc[]访问列?

1 个答案:

答案 0 :(得分:3)

link的报价:

  

我认为我们不能保证返回值的顺序   来自.loc操作,所以我倾向于说这不是错误,而是   让我们看看别人怎么说

因此,我们应该改用reindex

df.reindex(columns=pd.MultiIndex.from_product([a,['c','b']]))
     i        ii     
     c    b    c    b
0  102  101  105  104
1  108  107  111  110
2  114  113  117  116