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

