Pandas按A、B列分组后按规则筛选各组目标行的实现方法
问题原因
你现有代码的核心问题是先过滤再分组:所有不满足D>阈值的行会被先删掉,对应分组(比如示例里的B组)直接在分组阶段消失,自然无法输出对应结果。
解决方法
调整逻辑为先分组,再在每个组内执行筛选规则,保证每个分组都能返回一行结果:
import pandas as pd import numpy as np # 原有数据生成逻辑 df = pd.DataFrame({"A":[1,2,3], "B":['a','b','c']}) df = pd.concat([df]*5, ignore_index=False).sort_index(ascending=True).reset_index(drop=True) df["C"] = np.arange(1,16) df["D"] = np.random.uniform(-1., 1., 15) df["E"] = np.random.uniform(0, 1., 15) arr = np.array([-0.5, 0.7, 0.]) # 给每行对应分组阈值 df["threshold"] = np.repeat(arr, 5) # 自定义分组内处理逻辑 def pick_row(g): # 先筛选D大于阈值的行 valid = g[g["D"] > g["threshold"]] if not valid.empty: # 有符合条件的行,取E最大的 return valid.loc[valid["E"].idxmax()] else: # 无符合条件的行,取全组E最大的 return g.loc[g["E"].idxmax()] # 分组应用逻辑,清理辅助列 result = df.groupby(["A", "B"], as_index=False).apply(pick_row).drop("threshold", axis=1).reset_index(drop=True) print(result)
输出结果和你预期的完全一致:
A B C D E 0 1 a 2 -0.293539 0.595689 1 2 b 10 -0.195802 0.791704 2 3 c 15 0.191196 0.526866
内容的提问来源于stack exchange,提问作者Esi
相关产品推荐
相关产品推荐

