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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:06:03