python - 如何防止堆栈对索引进行排序?

标签 python pandas dataframe

我有一个测试数据框:

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

关于python - 如何防止堆栈对索引进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62985056/

相关文章:

Python 分箱代码并取平均值

python - Pandas 中的轴是什么意思?

python - 不打印 xpath 的空结果

python - 如何使用 `query` 方法检查列的元素是否包含特定字符串

python - 如何根据某列的值获取所有行的前3个值和后3个值?

python - 如何创建 python 空数据帧,其中 df.empty 结果为 True

python - 从模块导入*导入模块==?

Python win32com - 自动化 Word - 如何替换文本框中的文本?

python - 获取 Pandas 中某个索引值前后的行数

python - 在Python中从多个文件夹读取多个csv文件