首页 > 解决方案 > 为什么 pd.MultiIndex.from_tuples 改变元组的顺序

问题描述

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

标签: pythonpandasdataframe

解决方案


您可以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

请注意,这存在性能问题,因为预计索引将被排序以进行快速查找


推荐阅读