【问题标题】:How to preserve the column ordering when accessing a multi-index dataframe using `.loc`?使用`.loc`访问多索引数据框时如何保留列顺序?
【发布时间】:2019-05-27 15:27:18
【问题描述】:

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

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. 为什么 pandas 不保留顺序?我认为这非常危险,因为列表 ['c', 'b'] 暗示了从用户角度来看的排序。
  2. 如何在保持顺序的同时通过loc[] 访问列?

更新:(02.02.2020)

问题已确定为pandas bug。在修复它的过程中,this related issue 已被识别,它解决了 df.loc[:, pd.IndexSlice[:, ['c','b']]] 等表达式的语义歧义。

与此同时,可以使用接受的答案中描述的方法来规避问题。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    引用此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
    

    【讨论】:

    • 非常感谢!我在你提到的讨论线程中留下了一个便条。
    • 仅供参考。我的问题中描述的问题已被确定为错误。在修复它方面取得了进展,但还有一些额外的障碍需要克服。在完成此操作之前,您的解决方法仍然适用。
    猜你喜欢
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-01-29
    • 2013-05-18
    • 2014-02-27
    • 2021-09-02
    • 2013-04-11
    相关资源
    最近更新 更多