根据组

时间:2017-12-03 09:47:57

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

我通过应用以下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

请建议。

2 个答案:

答案 0 :(得分: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)

我的语法可能不正确,但也许类似的想法可行。

答案 1 :(得分:0)

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

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