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

Python pandas groupby后如何按Source优先级4>2>3实现条件筛选

解法1:groupby.apply 直接实现自定义条件筛选

这个方案完全符合你不需要提前新增优先级列、分组后直接按规则选择行的需求,逻辑和你描述的筛选规则完全对应:

import pandas as pd

# 示例数据
df = pd.DataFrame({'ID': [11, 11,11,11,22,22,33] ,
                   'Source': [2, 2,4,3,3,2,3],
                   'Price':[10, 20,30,40,50,60,70]})

# 分组筛选逻辑
def pick_row(group):
    # 优先选Source=4的行
    if (group['Source'] == 4).any():
        return group[group['Source'] == 4].iloc[0]
    # 次选Source=2的行
    elif (group['Source'] == 2).any():
        return group[group['Source'] == 2].iloc[0]
    # 最后选Source=3的行
    else:
        return group[group['Source'] == 3].iloc[0]

# 按ID分组后应用筛选规则
res = df.groupby('ID', as_index=False).apply(pick_row).reset_index(drop=True)

运行后res的输出和你给出的预期结果完全一致。


解法2:高性能方案(适合超大规模DataFrame)

如果你的DataFrame数据量很大,用apply遍历分组的性能会偏低,可以用分类类型设置优先级后取每组最大值对应的行,性能提升非常明显:

# 按优先级从低到高设置分类顺序,有序分类的最大值对应最高优先级
df['Source'] = pd.Categorical(df['Source'], categories=[3,2,4], ordered=True)
# 取每组Source优先级最高的行的索引,筛选对应行
res = df.loc[df.groupby('ID')['Source'].idxmax()].reset_index(drop=True)
# 可选:将Source列转回整数类型
res['Source'] = res['Source'].astype(int)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:57:03