代码之家  ›  专栏  ›  技术社区  ›  Eric O. Lebigot

Pandas数据帧中的级别列表是否保证排序?

  •  8
  • Eric O. Lebigot  · 技术社区  · 6 年前

    使用多索引创建Pandas数据帧时,级别似乎总是排序的:

    >>> pd.DataFrame([range(4)], columns=pd.MultiIndex.from_product([["b", "a"], [20, 10]]))
       b     a
      20 10 20 10
    0  0  1  2  3
    
    >>> _.columns
    MultiIndex(levels=[[u'a', u'b'], [10, 20]],
               labels=[[1, 1, 0, 0], [1, 0, 1, 0]])
    

    (注意如何 levels 有保证吗?了解这一点有助于编写健壮的代码(因为我们可以依赖多索引的一个简单属性)。

    还有 old examples (从2015年开始)这显示了不同的行为,但是熊猫现在是否提供了级别顺序的保证(就像python3.6提供了字典中键顺序的保证一样)?

    1 回复  |  直到 6 年前
        1
  •  3
  •   user3471881    6 年前

    创建 MultiIndex from_product() from_arrays() 由于两种方法都使用 _factorize_from_iterables() 返回已排序的索引。

    >> list(_factorize_from_iterables([["b", "a"], [20, 10]]))
    
    [[array([1, 0], dtype=int8), array([1, 0], dtype=int8)],
     [Index(['a', 'b'], dtype='object'), Int64Index([10, 20], dtype='int64')]]
    

    MultiIndex.from_tuples() 它也会使用排序级别 从_数组() 内部。

    如果你设置 多重指数

    >> midx = pd.MultiIndex(levels=[['b', 'a'], [20, 10]],
                                          labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
    >> df = pd.DataFrame(np.random.randn(4,4), columns=midx)
    
    >> df.columns
    
    MultiIndex(levels=[['b', 'a'], [20, 10]],
               labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
    

    以上用途 pandas 版本 0.22.0 0.23.4 (最新版本)。