按多索引数据框中每个组的值排序

问题描述

我正在尝试转换一个 MultiIndex 数据帧(它是从一个 xarray 数据集转换而来的,该数据集具有 3 个维度,分别是时间、纬度和经度以及两个变量“FFDI”和“REF_ID”)。

数据框看起来像:

  public chooseFileBtnClick(fieldName: string) {
    if (this.fileUploadMap.get(fieldName) === undefined) {
      this.isFileUploadCancel = true;
    }
  }

原始 xarray Dataset 时间的三个维度(17696,每天从 1972-01-20 到 2020-06-30)纬度(148)和经度(244)。

我想按每个(纬度、经度)组的 FFDI 值对日期/时间进行排序。

                                    FFDI    REF_ID
latitude    longitude   time        
-39.200001  140.800003  1972-01-20  1.2     0
                        1972-01-21  0.9     0
                        1972-01-22  1.5     0
                        1972-01-23  1.6     0
                        1972-01-24  1.1     0
                        1972-01-25  1.1     0
                        1972-01-26  1.0     0
                        1972-01-27  1.4     0
                        1972-01-28  1.4     0
                        1972-01-29  1.8     0
                        1972-01-30  1.7     0
                        1972-01-31  1.4     0
                        1972-02-01  0.9     0
                        1972-02-02  0.9     0
                        1972-02-03  1.4     0
            ...     ...     ...     ...     ...
-33.900002  150.000000  2020-06-17  0.7     36111
                        2020-06-18  0.9     36111
                        2020-06-19  1.6     36111
                        2020-06-20  1.8     36111
                        2020-06-21  0.6     36111
                        2020-06-22  0.4     36111
                        2020-06-23  0.6     36111
                        2020-06-24  0.6     36111
                        2020-06-25  1.2     36111
                        2020-06-26  1.3     36111
                        2020-06-27  1.1     36111
                        2020-06-28  1.7     36111
                        2020-06-29  0.9     36111
                        2020-06-30  1.8     36111
                        2020-07-01  0.8     36111
                        
639037952 rows × 2 columns

解决方法

我认为您需要 DataFrame.sort_values 的级别和列 FFDI

df = df.sort_values(['latitude','longitude','FFDI'],ascending=[True,True,False])
    

或者:

df = df.sort_values('FFDI',ascending=False).sort_index(level = [0,1],sort_remaining=False)

如果不能按前 2 个级别排序,请使用:

f = lambda x: x.sort_values('FFDI',ascending=False)
df = df.groupby(level=[0,group_keys=False,sort=False).apply(f)
,
import pandas as pd
import pandasql as ps

df = pd.read_csv("URCSV.csv")
a = ps.sqldf('Select * from df Group by "latitude","longitude" order by "FFDI" ')
print(a)