python - 在 Pandas 中使用 MultiIndex 从宽格式到长格式
问题描述
我有一个带有两个 MultiIndexes 的数据框(我理解为“宽格式”),我想重塑它,以便第二个索引成为一个新列(我理解为“长格式”)。有什么简单的方法可以做到这一点?
这是现在的数据框:
A = pd.DataFrame([[1, 2], [1, 2], [1, 2], [1, 2], [1, 2]],
columns=['h', 'k'], index=[1, 2, 3, 4, 5])
B = pd.DataFrame([[3, 4], [3, 4], [3, 4], [3, 4], [3, 4]],
columns=['h', 'k'], index=[1, 2, 3, 4, 5])
C = pd.DataFrame([[5, 6], [5, 6], [5, 6], [5, 6], [5, 6]],
columns=['h', 'k'], index=[1, 2, 3, 4, 5])
A.columns = pd.MultiIndex.from_product([['A'], A.columns])
B.columns = pd.MultiIndex.from_product([['B'], B.columns])
C.columns = pd.MultiIndex.from_product([['C'], C.columns])
ABC = pd.concat([A, B, C], axis = 1)
A B C
h k h k h k
1 1 2 3 4 5 6
2 1 2 3 4 5 6
3 1 2 3 4 5 6
4 1 2 3 4 5 6
5 1 2 3 4 5 6
这就是我想要实现的目标:
A B C new_col
1 1 3 5 h
2 1 3 5 h
3 1 3 5 h
4 1 3 5 h
5 1 3 5 h
1 2 4 6 k
2 2 4 6 k
3 2 4 6 k
4 2 4 6 k
5 2 4 6 k
(我希望能够直接在数据帧上执行此操作,而不必将其转换为另一个对象,例如 numpy 数组,以避免性能下降)。
解决方案
尝试:
print(
ABC.stack(level=1)
.reset_index(1)
.rename(columns={"level_1": "new_col"})
.sort_values("new_col")
)
印刷:
new_col A B C
1 h 1 3 5
2 h 1 3 5
3 h 1 3 5
4 h 1 3 5
5 h 1 3 5
1 k 2 4 6
2 k 2 4 6
3 k 2 4 6
4 k 2 4 6
5 k 2 4 6
推荐阅读
- javascript - 是否可以在服务器的 PHP 代码中生成的 AJAX 响应中执行 JavaScript?
- c# - NPOI:更改单元格中某些(不是全部)文本的字体颜色
- terminal - macOS 10.15 终端 - 取消链接得到“不允许操作”
- azure - OAUTH 流 - 事件中心
- ansible - Ansible 从 ansbile 事实值中删除引用
- sql - SQL:递归 CTE 的执行模型
- java - 在 NEXUS5X 29API 中找不到 TYPE_STEP_COUNTER 传感器
- java - 从 Windows 连接到远程 mysql 数据库
- c# - 等待/异步锁定 UI
- python - 如果匹配格式,则从字符串中删除整个文本块