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

Eri*_*got 8 python multi-index pandas

使用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]])
Run Code Online (Sandbox Code Playgroud)

(注意如何levels排序.)这有保证吗?知道这一点可以帮助编写健壮的代码(因为我们可以依赖MultiIndices的简单属性).

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

还有一些旧的例子(从2015年开始)显示了不同的行为,但是Pandas现在可能会提供关于级别排序的保证(就像Python 3.6提供字典中键的顺序保证一样)?

use*_*881 3

创建MultiIndexusingfrom_product()from_arrays()levels 时将进行排序,因为这两种方法都使用_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')]]
Run Code Online (Sandbox Code Playgroud)

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]])
Run Code Online (Sandbox Code Playgroud)

以上使用pandas版本(2017年12月29日发布)并在版本(最新版本)0.22.0上进行测试。0.23.4