根据特定列的索引级别 1 的值对多级数据框索引级别 0 进行排序
Sorting Multi level dataframe index level0, based on value of index level1 at specific column
我有这个多级数据框
import pandas as pd
sites = pd.Index(['CCC', 'RRR','TTT', 'SSS'], name='SITELIST')
vvv = pd.DataFrame({'KK':[1,2,3,4],'GG':[4,3,4,5], 'RR':[1,5,1,8]}, index = sites)
ttt = pd.DataFrame({'KK':[11,22,33,34],'GG':[23,33,34,35], 'RR':[1,2,2,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 'Site' 进行排序
预期结果如下:
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
我有这个多级数据框
import pandas as pd
sites = pd.Index(['CCC', 'RRR','TTT', 'SSS'], name='SITELIST')
vvv = pd.DataFrame({'KK':[1,2,3,4],'GG':[4,3,4,5], 'RR':[1,5,1,8]}, index = sites)
ttt = pd.DataFrame({'KK':[11,22,33,34],'GG':[23,33,34,35], 'RR':[1,2,2,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 'Site' 进行排序 预期结果如下:
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