【发布时间】:2019-05-27 15:27:18
【问题描述】:
让我们得到以下具有多索引列的数据框
import numpy as np
import pandas as pd
a = ['i', 'ii']
b = list('abc')
mi = pd.MultiIndex.from_product([a,b])
df = pd.DataFrame(np.arange(100,100+len(mi)*3).reshape([-1,len(mi)]),
columns=mi)
print(df)
# i ii
# a b c a b c
# 0 100 101 102 103 104 105
# 1 106 107 108 109 110 111
# 2 112 113 114 115 116 117
使用.loc[] 和pd.IndexSlice,我尝试按照这种顺序选择列'c' 和'b'。
idx = pd.IndexSlice
df.loc[:, idx[:, ['c','b']]]
但是,如果我查看输出,则不遵守请求的顺序!
# i ii
# b c b c
# 0 101 102 104 105
# 1 107 108 110 111
# 2 113 114 116 117
这是我的问题:
- 为什么 pandas 不保留顺序?我认为这非常危险,因为列表
['c', 'b']暗示了从用户角度来看的排序。 - 如何在保持顺序的同时通过
loc[]访问列?
更新:(02.02.2020)
问题已确定为pandas bug。在修复它的过程中,this related issue 已被识别,它解决了 df.loc[:, pd.IndexSlice[:, ['c','b']]] 等表达式的语义歧义。
与此同时,可以使用接受的答案中描述的方法来规避问题。
【问题讨论】:
标签: python pandas multi-index