我通过应用以下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
请建议。
答案 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