在pandas的分组(多重索引)中进行排序

4

编辑:加入示例数据df和预期输出。 编辑2:我稍微修改了数据,以便结果不是每种情况下与'cc'关联的最大数字都相同。

我的问题是:

  • 我有一个带有两个索引列(Index1, Index2)和三列(X、Y、Z)的数据框
  • 我创建了一个分组并对其应用了一个函数(将分组对象中的所有列缩放到1)
  • 我对结果数据框进行了求和,以获得每行的总和

该df为:

df = pd.DataFrame({'Index1': ['A', 'A', 'A', 'B', 'B', 'B'],
                'Index2': ['aa', 'bb', 'cc', 'aa', 'bb', 'cc'],
                'X': [1, 2, 7, 3, 6, 1],
                'Y': [2, 3, 6, 2, 4, 1],
                'Z': [3, 5, 9, 1, 2, 1]})

那么代码就是:

df_scored = pd.DataFrame()   #new df to hold results
cats = [X, Y, Z]             #categories (columns of df) to be scaled
grouped = df.groupby([Index 1, Index 2]).sum()
for cat in cats :
    df_scored[cat] = grouped.groupby(level = 0)[cat].apply(lambda x: x / x.max())
df_scored['Score'] = df_scored.sum(axis = 1)

这将产生以下结果:
                      X         Y         Z     Score
Index1 Index2                                        
A      aa      0.142857  0.333333  0.333333  0.809524
       bb      0.285714  0.500000  0.555556  1.341270
       cc      1.000000  1.000000  1.000000  3.000000
B      aa      0.500000  0.500000  0.500000  1.500000
       bb      1.000000  1.000000  1.000000  3.000000
       cc      0.166667  0.250000  0.500000  0.916667

现在我想按照Index 1的每个分组对生成的df_scored进行排序(这样Index 2就会在每个Index 1组内按'Score'排序),期望得到以下结果:

                      X         Y         Z     Score
Index1 Index2                                        
A      cc      1.000000  1.000000  1.000000  3.000000
       bb      0.285714  0.500000  0.555556  1.341270
       aa      0.142857  0.333333  0.333333  0.809524
B      bb      1.000000  1.000000  1.000000  3.000000
       aa      0.500000  0.500000  0.500000  1.500000
       cc      0.166667  0.250000  0.500000  0.916667

我该如何做到这一点?

我看到了一些关于此问题的其他提问(这里)(这里),但在我的情况下无法使其正常工作。


4
您能否提供一些可复现的代码/数据以进行测试? - jpp
3
请创建一些带有多级索引和期望输出的虚拟数据。这将有助于我们帮助您。 - Scott Boston
@jp_data_analysis和Scott已经尝试创建上述的数据/代码/期望的输出。当我运行它时,一切都正常——如果我需要进一步澄清,请告诉我。 - jbachlombardo
1个回答

6
在你的代码末尾添加以下内容。
df_scored.sort_values('Score', ascending= False).sort_index(level='Index1', sort_remaining=False)

谢谢 - 我觉得这是按照索引排序,而不是按照“分数”列排序?如果我调整数据以改变cc的结果不再是全面最高,它只会按照“Index2”字母顺序排序,而不是按照“分数”列的数字顺序排序。 - jbachlombardo
@jbachlombardo 编辑了答案。希望对你有所帮助。 - Sociopath
1
谢谢!运行得很顺利,非常感谢。 - jbachlombardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接