使用 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 提供字典中键顺序保证的方式相同)?
最佳答案
当使用 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
版本(最新版本)上进行测试).
关于python - 是否保证对 Pandas 数据框中的级别列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52947006/