Python 如何在使用“.loc”访问多索引数据帧时保留列顺序?

Python 如何在使用“.loc”访问多索引数据帧时保留列顺序?,python,pandas,multi-index,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) #

让我们看到下面的数据框架,其中包含多个索引列

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.indexlice
我尝试按这种顺序选择列
'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
以下是我的问题:

  • 为什么大熊猫不保存这种秩序?我认为这很危险,因为列表<代码> [c','b'] /COD>意味着从用户的角度进行排序。
  • 如何通过
    loc[]
    访问列,同时保留顺序

  • 更新:(2020年2月2日)

    问题已确定为。在修复它的过程中,已经确定了,这解决了诸如
    df.loc[:,pd.indexlice[:,['c','b']]]
    之类表达式的语义歧义

    同时,可以使用公认答案中所述的方法来规避该问题。

    引述如下:

    我认为我们不能保证返回值的顺序 所以我倾向于说这不是一个bug,而是 让我们看看别人怎么说

    因此,我们应该使用
    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
    

    非常感谢!我在您提到的讨论帖子中留下了一个便条。仅供参考。我的问题中描述的问题已被确定为bug。在解决这一问题上取得了进展,但还有一些额外的障碍需要克服。在此之前,您的变通方法仍然适用。