使用Pandas提取分组 Dataframe 中的前N个出现

qc6wkl3g  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(168)

我一直在努力找出每种类型餐厅中出现频率最高的前3个餐厅名称

这些列包括:
rest_type-表示餐馆类型的列
name-餐厅名称列
url-用于计数发生次数的列
这是经过一番搜索后最终为我工作的代码:

df_1=df.groupby(['rest_type','name']).agg('count')
datas=df_1.groupby(['rest_type'], as_index=False).apply(lambda x : x.sort_values(by="url",ascending=False).head(3))
['url'].reset_index().rename(columns={'url':'count'})

最后产出如下:

我有几个关于以上代码的问题:
我们如何能够在之前对datas变量进行分组后再次使用rest_type进行groupby操作?它应该不会给出缺少列的错误吗?第二个groupby操作对我来说有点混乱。
第一个列level_0表示什么?我尝试了as_index=True的代码,它创建了一个索引和属于rest_type的列,所以我无法重置索引。输出如下:

谢谢

ttvkxqim

ttvkxqim1#

您可以再次使用groupby,因为它出现在groupby可以识别的索引中。
level_0来自reset_index命令,因为您的索引未命名。
也就是说,如果我理解了你的数据集,我觉得你可以更容易地实现你的目标:

import random
df = pd.DataFrame({'rest_type': random.choices('ABCDEF', k=20),
                   'name': random.choices('abcdef', k=20),
                   'url': range(20), # looks like this is a unique identifier
                  })

def tops(s, n=3):
    return s.value_counts().sort_values(ascending=False).head(n)

df.groupby('rest_type')['name'].apply(tops, n=3)

编辑:这里有一个替代方法,可以将结果格式化为带有信息性列名的 Dataframe

(df.groupby('rest_type')
   .apply(lambda x: x['name'].value_counts().nlargest(3))
   .reset_index().rename(columns={'name': 'counts', 'level_1': 'name'})
)
dw1jzc5e

dw1jzc5e2#

我有一个类似的例子,上面的查询看起来部分工作。在我的例子中,同现值总是1。在我的输入 Dataframe 中。

我的疑问如下
top_five_family_cooccurence_df = (common_top25_cooccurance1_df.groupby('family') .apply(lambda x: x['related_family'].value_counts().nlargest(5)) .reset_index().rename(columns={'related_family': 'cooccurence', 'level_1': 'related_family'}) )
我得到的结果为

其中同现总是给我1.

相关问题