【问题标题】:sort by values for each group in a MultiIndex dataframe按 MultiIndex 数据框中每个组的值排序
【发布时间】:2021-06-13 10:07:22
【问题描述】:

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

数据框如下所示:

                                    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

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

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

                                    FFDI    REF_ID
latitude    longitude   time        
-39.200001  140.800003  2009-02-07  10.2    0
                        2009-01-30  10.1    0
                        1983-02-12  10.0    0
                        2003-01-13  9.8     0
                        2019-12-28  9.8     0
                        2000-01-17  9.7     0
            ...     ...     ...     ...     ...

-33.900002  150.000000  ... ...     ...     ...
                        1994-06-16  0.9     36111
                        1978-07-07  0.2     36111
                        2020-08-28  0.1     36111
                        2007-06-09  0.0     36111
                        1994-07-30  0.0     36111
                        1987-06-21  0.0     36111
                        
639037952 rows × 2 columns

【问题讨论】:

    标签: python pandas python-xarray


    【解决方案1】:

    我认为您需要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, 1], group_keys=False, sort=False).apply(f)
    

    【讨论】:

      【解决方案2】:
      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)
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      • @MarkRotteveel tnx 寻求建议。认为这很清楚很容易。只是想以代码的形式分享我的想法。
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2022-11-13
      • 2020-04-20
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多