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

Python:在Pandas中按层级结构分组获取指定优先级值

按分组优先级筛选DataFrame记录

原始数据

import pandas as pd

df = pd.DataFrame({
    'id': [1, 1, 1, 2, 2, 2],
    'interval': [8, 8, 8, 2, 2, 3],
    'name': ['A', 'B', 'C', 'B', 'C', 'A']
})

需求

按id和interval分组,每组保留一个name,优先级规则为 A优先于B和C,B优先于C。

解决方案

方法1:映射优先级后排序分组

通过给name映射对应优先级数值,按优先级降序排序后,每组取第一行即可得到目标结果:

# 定义优先级映射,数值越高优先级越高
priority_map = {'A': 3, 'B': 2, 'C': 1}
# 添加优先级辅助列
df['priority'] = df['name'].map(priority_map)
# 按id、interval分组,每组按优先级降序排序后取首行,最后删除辅助列
result = df.sort_values('priority', ascending=False)\
           .groupby(['id', 'interval'], as_index=False)\
           .first()\
           .drop('priority', axis=1)

方法2:使用idxmax直接定位最高优先级行

利用idxmax获取每组中优先级最高的行索引,直接提取对应行:

priority_map = {'A': 3, 'B': 2, 'C': 1}
# 计算每行优先级,分组后取优先级最大的行索引,再提取对应行
result = df.loc[df['name'].map(priority_map).groupby([df['id'], df['interval']]).idxmax()]
# 重置索引(可选,让结果更整洁)
result = result.reset_index(drop=True)

最终结果

print(result)
# 输出:
#    id  interval name
# 0   1         8    A
# 1   2         2    B
# 2   2         3    A

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:22:05