【问题标题】:Sort grouped by dataframe according to the count values of groups根据组的计数值按数据框分组排序
【发布时间】:2017-12-03 09:47:56
【问题描述】:

我通过应用以下 2 个查询对数据框组内的值进行了分组和排序:

df = df.groupby(['table_name','query_param_clean2']).size().to_frame('count').reset_index()

df = df.sort_values(['table_name','count'],ascending=False).groupby('table_name').apply(lambda x: x)

数据框现在看起来像这样:

table_name           query_param_clean2           count
A                       query4                    24
A                       query1                    16
A                       query2                    8
B                       query5                    56
B                       query6                    50
C                       query3                    100
D                       query1                    13
D                       query4                    12
D                       query2                    10
D                       query8                    1

在这里,我将数据框正确分组并根据组中的计数进行排序。现在,我想做组之间的排序。

例如: table_name 下的 C 第一行的最大值为 100,因此 C 应该是输出中的顶部组,在 C 之后, B 应该在那里,因为 B 的第一行的第二大值为 56 100.

输出数据框应如下所示。

我可以在我的第二行代码中添加什么或添加其他内容以获取以下表格中的数据。

table_name           query_param_clean2           count
C                       query3                    100
B                       query5                    56
B                       query6                    50
A                       query4                    24
A                       query1                    16
A                       query2                    8
D                       query1                    13
D                       query4                    12
D                       query2                    10
D                       query8                    1

请提出建议。

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    我想到的解决方案是首先获取按最高记录的最高计数排序的table_name 列表。然后按此列表的顺序对您的df 进行排序。

    first = df.sort_values(['table_name','count'],ascending=False).groupby('table_name').first()
    ordered = first.sort_values(['count'], ascending=False)
    orderedNameList = ordered['table_name'].tolist()
    df = df.sort_values(['table_name'],ascending=orderedNameList)
    

    我的语法可能不正确,但类似的想法可能会起作用。

    【讨论】:

      【解决方案2】:

      这是一种方式。这里我根据每个table_name的最大值显式计算一个order列,按此列排序,然后删除它。

      lst = df.groupby('table_name', as_index=False)['count'].max().\
               sort_values('count', ascending=False)['table_name'].tolist()
      
      df['order'] = df['table_name'].map({j: i for i, j in enumerate(lst)})
      
      df = df.sort_values('order').drop('order', 1)
      
      #   table_name query_param_clean2  count
      # 5          C             query3    100
      # 3          B             query5     56
      # 4          B             query6     50
      # 0          A             query4     24
      # 1          A             query1     16
      # 2          A             query2      8
      # 6          D             query1     13
      # 7          D             query4     12
      # 8          D             query2     10
      # 9          D             query8      1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-30
        相关资源
        最近更新 更多