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
相关产品推荐
相关产品推荐

