Pandas多级索引数据按索引与值排序:年度消息量Top3求解
解决方法
咱们一步步来搞定这个需求,你已经完成了分组计数的第一步,剩下的排序和筛选操作很简单:
步骤1:分组计数后按规则排序
先把分组后的结果按年份升序、同一年份内消息量降序排序,直接用sort_values就能实现:
import pandas as pd # 你的原始数据 data = { 'year': [2018,2017,2019,2017,2017,2020,2020,2020,2020], 'month': [2,4,5,5,5,4,6,6,6], 'message': ['txt1','txt2','txt3','txt5','txt4','txt3','txt3','txt3','txt4'] } df = pd.DataFrame(data) # 你已经完成的分组计数操作 count_df = df.groupby(['year', 'month']).count() # 按年份升序、消息量降序排序 sorted_count = count_df.sort_values(by=['year', 'message'], ascending=[True, False])
步骤2:提取每年消息量Top3的月份
接下来对每个年份分组,提取每组的前3条数据(如果某年份不足3个月份,就自动保留所有数据):
top3_per_year = sorted_count.groupby(level='year').head(3)
调整显示格式(匹配你要的样式)
最后设置pandas的显示参数,让多级索引里的重复年份只显示一次,就能得到你想要的缩进效果:
pd.set_option('display.multi_sparse', True) print(top3_per_year)
运行后输出和你要的结果完全一致:
message year month 2017 5 2 4 1 2018 2 1 2019 5 1 2020 6 3 4 1
小补充
level='year'是因为分组后是多级索引(year和month),指定层级就能直接按年份筛选。display.multi_sparse参数默认是开启的,但如果你的环境里没生效,手动设置一下就能让相同的上层索引自动隐藏重复值。
内容的提问来源于stack exchange,提问作者taminur
相关产品推荐
相关产品推荐

