python - 如何防止堆栈对索引进行排序?
问题描述
我有一个测试数据框:
df1 = pd.DataFrame({
"Group1": ["X", "Y", "Y", "X", "Y", "Z", "X", "Y"],
"Group2": ["A", "C", "A", "B", "C", "C", "B", "A"],
"Number1": [1, 3, 5, 1, 5, 2, 5, 3],
"Number2": [6, 2, 6, 2, 7, 2, 6, 8],
})
df2 = df1.pivot_table(index="Group1", columns="Group2", margins=True)
print(df2)
输出:
Number1 Number2
Group2 A B C All A B C All
Group1
X 1.0 3.0 NaN 2.333333 6.000000 4.0 NaN 4.666667
Y 4.0 NaN 4.000000 4.000000 7.000000 NaN 4.500000 5.750000
Z NaN NaN 2.000000 2.000000 NaN NaN 2.000000 2.000000
All 3.0 3.0 3.333333 3.125000 6.666667 4.0 3.666667 4.875000
当我调用stack
这个数据框时,我得到了这个结果:
df3 = df2.stack()
print(df3)
输出:
Number1 Number2
Group1 Group2
X A 1.000000 6.000000
All 2.333333 4.666667
B 3.000000 4.000000
Y A 4.000000 7.000000
All 4.000000 5.750000
C 4.000000 4.500000
Z All 2.000000 2.000000
C 2.000000 2.000000
All A 3.000000 6.666667
All 3.125000 4.875000
B 3.000000 4.000000
C 3.333333 3.666667
如何防止stack
对索引进行排序以使顺序Group2
保持不变A, B, C, All
?
解决方案
IIUC,我们需要pd.Index.get_level_values
和DataFrame.reindex
df2.stack().reindex(df2.columns.get_level_values(1).unique(), level='Group2')
Number1 Number2
Group1 Group2
X A 1.000000 6.000000
B 3.000000 4.000000
All 2.333333 4.666667
Y A 4.000000 7.000000
C 4.000000 4.500000
All 4.000000 5.750000
Z C 2.000000 2.000000
All 2.000000 2.000000
All A 3.000000 6.666667
B 3.000000 4.000000
C 3.333333 3.666667
All 3.125000 4.875000
我们可以使用level='Group2'
或level=1
推荐阅读
- shell - 服务启动时无法执行shell命令,但重启服务正常
- git - Go mod 用私有分支替换依赖
- mongodb - 如何从文档中的对象数组中仅获取一个与搜索条件匹配的对象?
- c# - WPF - MVVM:如何用鼠标绘制可移动的矩形
- ios - 在 Iphone 上禁用 Progressive Web App 上的后退按钮
- netbeans - 来自数据库的实体类不映射来自不同模式的实体
- recursion - 等差数列数
- python - 将文件上传到烧瓶应用程序会给出 NotADirectoryError: [Errno 20] Not a directory
- python - AttributeError:“BoundingBoxesOnImage”对象没有属性“项目”
- python - 服务器和更多客户端之间的 Python NAT 打孔