如何在Pandas DataFrame中按组保留优先级最高的选择行?
处理Pandas分组后保留指定优先级最高行的问题
需求说明
现有包含Group和Choice列的Pandas DataFrame,需按Group分组后,仅保留每组中优先级最高的Choice行。优先级顺序为:First Choice > Second Choice > Third Choice > Fourth Choice。由于数据规模较大,需要可扩展的高效解决方案。
示例输入
Group Choice Group1 First Choice Group1 Second Choice Group1 Third Choice Group2 Third Choice Group2 Fourth Choice Group3 Second Choice Group3 Fourth Choice
期望输出
Group Choice Group1 First Choice Group2 Third Choice Group3 Second Choice
可复现代码
import pandas as pd d = {'Group': ['Group1', 'Group1', 'Group1', 'Group2', 'Group2', 'Group3', 'Group3'], 'Choice': ['First Choice', 'Second Choice', 'Third Choice', 'Third Choice', 'Fourth Choice', 'Second Choice', 'Fourth Choice']} df = pd.DataFrame(data=d)
高效解决方案
利用Pandas的分类类型(Categorical)指定自定义排序优先级,结合分组操作实现高效筛选,该方法适合大规模数据集:
步骤1:定义优先级并转换列类型
将Choice列转换为有序分类类型,指定优先级顺序,这样排序时会遵循自定义规则而非默认字典序:
priority_order = ['First Choice', 'Second Choice', 'Third Choice', 'Fourth Choice'] df['Choice'] = pd.Categorical(df['Choice'], categories=priority_order, ordered=True)
步骤2:分组筛选最高优先级行
按Group分组后,直接取每组中Choice优先级最高的行(由于分类类型已定义顺序,idxmin()会返回优先级最高的行索引,因为优先级越高的分类值越小):
result = df.loc[df.groupby('Group')['Choice'].idxmin()]
验证结果
执行上述代码后,打印result即可得到期望输出:
print(result)
输出:
Group Choice 0 Group1 First Choice 3 Group2 Third Choice 5 Group3 Second Choice
方案优势
- 效率高:分类类型的排序和分组操作均为Pandas内部优化的矢量化操作,处理大规模数据时性能远优于循环或自定义函数
- 可扩展性:若后续需要调整优先级,只需修改
priority_order列表即可,无需改动核心逻辑
内容的提问来源于stack exchange,提问作者Niam45
相关产品推荐
相关产品推荐

