python - 是否保证对 Pandas 数据框中的级别列表进行排序?

标签 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 提供字典中键顺序保证的方式相同)?

最佳答案

当使用 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/

相关文章:

python - 标准化频率并将数据帧中的多个时间序列扩展到给定日期

python - 已知类的属性如何在python中获取该类

python - 将参数传递给 python 二进制可执行文件

python - 将 Python Dataframe 写入具有特定格式的 Word/Excel 文档

python - 将 MultiIndex 数据框 reshape 为表格格式

python - 如何让 python 读取 .txt 文件的每一行?

python - Pandas 使用多索引列取消堆叠

python - 如何根据前一行信息更新pandas DataFrame

python - 在 Pandas 中加入具有不同级别数的 MultiIndex

python - 在 Pandas 中将两个 MultiIndex 级别合并为一个级别