使用 from_tuples 创建多索引时,创建索引对象的顺序与输入元组的顺序不同
我正在尝试使用 pd.MultiIndex.from_tuples 方法向数据框添加列级别,但级别与我预期的不同。
df = pd.DataFrame({'x_1':[1, 2], 'x_2':[3, 4], 'x_10':[3, 4], 'y_1':[5, 6], 'y_2':[7, 8], 'y_10':[1, 2]})
df = df.reindex(columns=['x_1', 'x_2', 'x_10', 'y_1', 'y_2', 'y_10'])
index = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])
print(index)
MultiIndex(levels=[['x', 'y'], ['1', '10', '2']],
labels=[[0, 0, 0, 1, 1, 1], [0, 2, 1, 0, 2, 1]])
当我将级别添加到数据框并执行堆叠时,顺序不是我想要的。
df.columns = index
df.stack()
x y
0 1 1 5
10 3 1
2 3 7
1 1 2 6
10 4 2
2 4 8
我希望索引水平看起来像:
MultiIndex(levels=[['x', 'y'], ['1', '2', '10']])
堆叠看起来像下面这样:
df.stack()
x y
0 1 1 5
2 3 7
10 3 1
1 1 2 6
2 4 8
10 4 2
最佳答案
您可以 reindex
在特定级别,在调用 stack
之前传递列中的级别值:
In[177]:
df.stack().reindex(df.columns.get_level_values(1).unique(), level=1)
Out[177]:
x y
0 1 1 5
2 3 7
10 3 1
1 1 2 6
2 4 8
10 4 2
请注意,这会带来性能问题,因为需要对索引进行排序以进行快速查找
关于python - 为什么 pd.MultiIndex.from_tuples 改变元组的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54257519/