Pandas如何按Metric列groupby后按2021列排序得到目标DataFrame
问题原因
你原有代码出现问题的核心原因有两个:
groupby操作本身返回的是DataFrameGroupBy中间对象,只有后续执行聚合、过滤、取值等操作后才会返回结构化的DataFrame,直接赋值自然只能拿到分组对象- 你的需求本质是同Metric分组内按2021降序排列,不需要做分组聚合,直接用多字段排序就能实现,不用复杂的groupby操作
正确实现代码
方案1:多字段排序(最优,性能最高)
直接按两个字段排序即可完全匹配你期望的输出:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ 'Metric': ['Total Assets', 'Total Promo', 'Total Assets', 'Total Promo'], 'Risk': ['High', 'High','Low', 'Low'], '2021': [ 200, 100, 400, 50]}) # 排序逻辑:先按Metric升序保证同类指标放一起,再按2021降序 df = df.sort_values(by=['Metric', '2021'], ascending=[True, False]).reset_index(drop=True) print(df)
运行后输出完全符合你的预期:
Metric Risk 2021 0 Total Assets Low 400 1 Total Assets High 200 2 Total Promo High 100 3 Total Promo Low 50
方案2:groupby实现(满足你要先groupby的要求)
如果一定要先执行groupby逻辑,可以在分组后对每个组做排序:
df = df.groupby('Metric', group_keys=False).apply(lambda x: x.sort_values('2021', ascending=False)).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者postcolonialist
相关产品推荐
相关产品推荐

