【问题标题】:Is the list of levels in a Pandas dataframe guaranteed to be sorted?是否保证对 Pandas 数据框中的级别列表进行排序?
【发布时间】:2019-03-27 13:42:18
【问题描述】:

当使用 MultiIndex 创建 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 是如何排序的。)这有保证吗?了解这一点有助于编写健壮的代码(因为我们可以依赖 MultiIndices 的一个简单属性)。

我在文档中找不到任何保证(但这并不意味着它不存在!)。

还有 old examples(从 2015 年开始)表现出不同的行为,但也许 Pandas 现在提供级别顺序保证(就像 Python 3.6 提供字典中键顺序的保证一样) ?

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    当使用from_product()from_arrays() 创建MultiIndex 时,级别将被排序,因为这两种方法都使用_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() 也将具有排序级别,因为它在内部使用 from_arrays()

    如果您设置MultiIndex 而不指定方法,则不会对级别进行排序。

    >> 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(2017年12月29日发布)并在0.23.4版本(最新版本)上进行测试。

    【讨论】:

    • 好点,关于手动创建索引。现在 Pandas 社区的问题是 MultiIndex 创建函数的排序行为是否可以在文档中得到保证(以及通过向后兼容性)。
    猜你喜欢
    • 2013-06-05
    • 2020-02-29
    • 2019-03-07
    • 2018-10-09
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多