代码之家  ›  专栏  ›  技术社区  ›  normanius

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

  •  3
  • normanius  · 技术社区  · 7 年前

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

    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[] 同时保持有序性?

    更新:(02.02.2020)

    pandas bug . 在修复过程中,, this related issue 已确定,这解决了表达式的语义歧义,如 df.loc[:, pd.IndexSlice[:, ['c','b']]]

    同时,可以使用公认答案中描述的方法来回避这个问题。

    1 回复  |  直到 6 年前
        1
  •  3
  •   normanius    7 年前

    引述 link :

    我认为我们不能保证返回值的顺序 让我们看看别人怎么说

    所以我们应该使用 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