pandas 基于层次结构的Groupby多列排序

vfh0ocws  于 2023-03-06  发布在  其他
关注(0)|答案(2)|浏览(186)

我正在尝试按列的层次结构/顺序对groupby的结果进行排序。
Dataframe 示例:

df = pd.DataFrame({'A':['A1','A1','A1','A2','A2','A2','A1','A1'],
                   'B':['B2','B1','B1','B1','B1','B2','B2','B2'],
                   'C':['C1','C3','C1','C3','C2','C2','C1','C3'],
                   'V':[100,240,110,120,50,60,40,40]})

然后执行groupby操作:

df.groupby(['A','B','C']).agg({'V':'sum'}).sort_values(by=['A','V','B','V'],ascending=[False,False,False,False])

输出:

V
A   B   C   
A2  B1  C3  120
    B2  C2  60
    B1  C2  50
A1  B1  C3  240
    B2  C1  140
    B1  C1  110
    B2  C3  40

然而,我想要的是A1应该首先基于它自己的总值排序(不管B和C值如何),然后B基于它自己的总值排序。
因此输出应该如下所示:

V
A   B   C   
A1  B1  C3  240
    B1  C1  110
    B2  C1  140
    B2  C3  40
A2  B1  C3  120
    B1  C2  50
    B2  C2  60

如果我能解释清楚就告诉我。

vuktfyat

vuktfyat1#

df = pd.DataFrame({'A':['A1','A1','A1','A2','A2','A2','A1','A1'],
                   'B':['B2','B1','B1','B1','B1','B2','B2','B2'],
                   'C':['C1','C3','C1','C3','C2','C2','C1','C3'],
                   'V':[100,240,110,120,50,60,40,40]})



aa = df.groupby(['A','B','C']).sum()
print(aa)

"""
            V
A  B  C      
A1 B1 C1  110
      C3  240
   B2 C1  140
      C3   40
A2 B1 C2   50
      C3  120
   B2 C2   60

"""

t1= (
    df.groupby(['A','B','C']).sum().sort_values(['V','C'],ascending=False)
    .sort_index(level=[0,1],sort_remaining = False)
    )

print(t1)

"""
            V
A  B  C      
A1 B1 C3  240
      C1  110
   B2 C1  140
      C3   40
A2 B1 C3  120
      C2   50
   B2 C2   60

"""
aelbi1ox

aelbi1ox2#

IIUC,您希望同时按ABV列进行排序

out = (df.groupby(['A','B','C']).agg({'V':'sum'})
       .sort_values(by=['A','B','V'], ascending=[True,True,False]))
print(out)

            V
A  B  C
A1 B1 C3  240
      C1  110
   B2 C1  140
      C3   40
A2 B1 C3  120
      C2   50
   B2 C2   60

相关问题