熊猫数据框中的级别列表是否保证可以排序?

时间:2018-10-23 10:41:13

标签: python pandas multi-index

在创建具有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提供了对键顺序的保证一样)。字典)?

1 个答案:

答案 0 :(得分:3)

在使用MultiIndexfrom_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()也将具有排序级别,因为它在内部使用了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版本(最新发行版)上进行了测试。

相关问题