Python Pandas 按列排序多索引,但保留树形结构

2024-09-30 01:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

使用pandas 0.20.3,我试图通过列('D')和值(向下)对数据帧的n个多级别进行排序,以便保持组的层次结构。在

输入示例:

                    D
A     B     C
Gran1 Par1  Child1  3
            Child2  7
            Child3  2
      Par2  Child1  9
            Child2  2
      Par3  Child1  6
Gran2 Par1  Child1  3
      Par2  Child1  8
            Child2  2
            Child3  3
      Par3  Child1  6
            Child2  8

期望结果:

^{pr2}$

其他与多级索引排序和排序有关的问题的解决方案,似乎都集中在对索引的实际级别进行排序或在对列排序时保持其有序性。我没有找到一个多级排序,在这种排序中,列的值用于在该特定级别按聚合值对索引进行排序。如有任何建议,我们将不胜感激。在


Tags: 数据示例pandas层次结构排序级别par2pr2
2条回答

您需要创建三个独立的数组,并根据它们的组合进行排序。在这个例子中,我使用Numpy的np.lexsort进行排序,然后使用iloc来进行排序。最后,我使用a[::-1]来获得反向排序。在

a = np.lexsort([
    df.D.values,
    df.groupby(level=[0, 1]).D.transform('sum').values,
    df.groupby(level=0).D.transform('sum').values
])

df.iloc[a[::-1]]

                   D
A     B    C        
Gran2 Par3 Child2  8
           Child1  6
      Par2 Child1  8
           Child3  3
           Child2  2
      Par1 Child1  3
Gran1 Par1 Child2  7
           Child1  3
           Child3  2
      Par2 Child1  9
           Child2  2
      Par3 Child1  6

对于来自MultiIndex的列,需要^{},对于sum值需要^{},然后是^{}和最后一个^{}

df = df.reset_index()
df['G'] = df.groupby(['A','B'])['D'].transform('sum')

df = df.sort_values(['A','G','D'], ascending=False).drop('G',1).set_index(['A','B','C'])
print (df)

                   D
A     B    C        
Gran2 Par3 Child2  8
           Child1  6
      Par2 Child1  8
           Child3  3
           Child2  2
      Par1 Child1  3
Gran1 Par1 Child2  7
           Child1  3
           Child3  2
      Par2 Child1  9
           Child2  2
      Par3 Child1  6

相关问题 更多 >

    热门问题