You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas分组统计后如何获取每组前N个高频类型并保留列?

解决Pandas按年月分组取高频类型并保留列的问题

我明白你遇到的困扰啦——只针对count列用nlargest的话,确实会弄丢type这类关键字段。下面给你两种实用的解决方法,都能完美保留所有需要的列:

方法一:用groupby.apply结合nlargest

这种方法直接对每个分组的完整DataFrame操作,能一次性保留所有列:

# 取每个(年份,月份)组的前5个高频类型
top_n = freq_df.groupby(['open_year', 'open_month']).apply(
    lambda x: x.nlargest(5, 'count')
).reset_index(drop=True)

小解释:

  • groupby.apply(lambda x: ...)会把每个(年份,月份)对应的子DataFrame传给lambda函数
  • x.nlargest(5, 'count')在子DataFrame里按count列取前5行,自然保留了type和其他列
  • reset_index(drop=True)是为了去掉groupby生成的多级索引,让结果更整洁易读

方法二:用rank排名后筛选

如果你需要更灵活的排名逻辑(比如处理并列频次的情况),可以先给每个分组内的count排名,再筛选排名前N的行:

# 给每个(年份,月份)组内的count降序排名,method='first'处理并列(按出现顺序排)
freq_df['rank'] = freq_df.groupby(['open_year', 'open_month'])['count'].rank(
    ascending=False, method='first'
)
# 筛选排名<=5的行,最后删掉临时的rank列
top_n = freq_df[freq_df['rank'] <= 5].drop('rank', axis=1)

可选调整:

  • 如果想让并列频次的类型都保留,可以把method='first'换成method='min',这样同频次的会有相同的排名,都会被选中

为什么之前的方法失效?

你之前写的freq_df.groupby(['open_year','open_month'])['count'].nlargest(5),是先选中了count列再做分组取前N,返回的是只有count值的Series,所以自然丢失了type列。只要把操作对象换成整个分组的DataFrame,就能保留所有字段啦~

内容的提问来源于stack exchange,提问作者HHH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:34:13