在创建具有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提供了对键顺序的保证一样)。字典)?
答案 0 :(得分:3)
在使用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()
也将具有排序级别,因为它在内部使用了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
版本(最新发行版)上进行了测试。