python - 为什么 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
解决方案
您可以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 - 更改 numpy 数组列表中的值
- java - 尝试将密码添加到 Firebase 实时数据库,但没有显示?
- android - 将 gradle 问题从 2.3.3 升级到 3.5.1
- java - 同一用户登录情况下的 Keycloak 终止会话
- sql - 如何将“2019-11-02T20:18:00Z”转换为 HQL 中的时间戳?
- django - django 中是否有任何内置功能可以在每月的特定日期调用方法?
- google-maps - 如何在 Vue 中保存谷歌地图编辑的多边形路径
- javascript - 如何在 Mongoose 中验证对象数组
- java - 无法找到或加载主类 - 在 Intellij 中构建工件后出错
- api - Google Drive API:强制共享文件夹的文件所有权