根据特定列的索引级别1的值对多级别数据框索引级别0进行排序

问题描述

我有这个多级数据框

import pandas as pd
sites = pd.Index(['CCC','RRR','TTT','SSS'],name='SITELIST')
vvv = pd.DataFrame({'KK':[1,2,3,4],'GG':[4,4,5],'RR':[1,5,1,8]},index = sites)
ttt = pd.DataFrame({'KK':[11,22,33,34],'GG':[23,34,35],1]},index = sites)
df = pd.concat([vvv,ttt],axis=0,keys=["VVV","TTT"],names=['Sensor','Site'])
df = df.swaplevel().sort_index(level=0).reindex(['VVV','TTT'],level=1)
print(df)

数据框:

             KK  GG  RR
Site Sensor            
CCC  VVV      1   4   1
     TTT     11  23   1
RRR  VVV      2   3   5
     TTT     22  33   2
SSS  VVV      4   5   8
     TTT     34  35   1
TTT  VVV      3   4   1
     TTT     33  34   2

如何使用列RR的索引级别1'VVV'上的每个值对数据帧索引级别0'站点'进行排序 预期结果如下:

             KK  GG  RR
Site Sensor            
CCC  VVV      1   4   1 <-
     TTT     11  23   1
TTT  VVV      3   4   1 <-
     TTT     33  34   2
RRR  VVV      2   3   5 <-
     TTT     22  33   2
SSS  VVV      4   5   8 <-
     TTT     34  35   1

我尝试与

进行排序
print(df.sort_values('RR'))

但是出乎意料

             KK  GG  RR
Site Sensor            
CCC  VVV      1   4   1
     TTT     11  23   1
SSS  TTT     34  35   1
TTT  VVV      3   4   1
RRR  TTT     22  33   2
TTT  TTT     33  34   2
RRR  VVV      2   3   5
SSS  VVV      4   5   8

谢谢。

解决方法

IIUC,您可以首先reset_index进行排序并获得正确的site顺序:

df = (df.reset_index().sort_values(["Sensor","RR","Site"],ascending=(False,True,True)))

   Site Sensor  KK  GG  RR
0  CCC    VVV   1   4   1
6  TTT    VVV   3   4   1
2  RRR    VVV   2   3   5
4  SSS    VVV   4   5   8
1  CCC    TTT  11  23   1
5  SSS    TTT  34  35   1
3  RRR    TTT  22  33   2
7  TTT    TTT  33  34   2

从此处使用结果构造有序的pd.Categorical,以便获得最终结果:

df["Site"] = pd.Categorical(df["Site"],categories=df["Site"].unique(),ordered=True)

print (df.sort_values("Site").set_index(["Site","Sensor"]))

             KK  GG  RR
Site Sensor            
CCC  VVV      1   4   1
     TTT     11  23   1
TTT  VVV      3   4   1
     TTT     33  34   2
RRR  VVV      2   3   5
     TTT     22  33   2
SSS  VVV      4   5   8
     TTT     34  35   1

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...