У меня есть этот многоуровневый фрейм данных

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

Как отсортировать индекс фрейма данных уровня 0 «Сайт», используя каждое значение на уровне индекса 1 «VVV» в столбце RR Ожидаемый результат как таковой:

             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

Спасибо.

1
Bangkit Cipta Persada 20 Сен 2020 в 21:05

1 ответ

Лучший ответ

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
2
Henry Yik 20 Сен 2020 в 18:52