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

