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

Pandas按条件分组求指定列最小值并标记对应行的方法

Pandas分组筛选最小值实现方案

你之前的代码问题在于没有提前过滤B列值为"YES"的行,会把B="NO"的记录纳入最小值计算,不符合需求,可按以下步骤实现两个目标:


1. 生成统计结果表df2

先过滤B="YES"的行,再按A列分组求C列最小值,最后调整列名和列顺序即可:

# 过滤B为YES的记录后分组求最小值
df2 = df[df["B"] == "YES"].groupby("A", as_index=False)["C"].min()
# 重命名列、新增固定值Y列、调整列顺序
df2 = df2.rename(columns={"A": "X", "C": "Z"})
df2["Y"] = "YES"
df2 = df2[["X", "Y", "Z"]]

执行后得到的df2和预期结果完全一致:

X    Y   Z
0  1  YES  13
1  2  YES   3

2. 生成带标记列的df3

先通过分组映射拿到每个A分类下B="YES"对应的C列最小值,再逐行判断是否满足标记条件,避免跨分组、跨B类别的误匹配:

df3 = df.copy()
# 构建A分组到对应YES下最小C值的映射关系
min_yes_c = df[df["B"] == "YES"].groupby("A")["C"].min()
# 满足B为YES 且 C等于分组最小值的行标记为1,其余为0
df3["D"] = (
    (df3["B"] == "YES") & 
    (df3["A"].map(min_yes_c) == df3["C"])
).astype(int)

执行后得到的df3和预期结果完全一致:

A    B   C  D
0   1  YES  20  0
1   1  YES  13  1
2   1   NO  18  0
3   1   NO   4  0
4   1   NO   9  0
5   1  YES  42  0
6   2  YES  22  0
7   2   NO   2  0
8   2  YES   3  1
9   2  YES   7  0
10  2   NO  51  0

注意:不要直接用最小值和原表merge打标,否则如果存在不同B分类下C值恰好等于最小值的情况(比如样例中A=1下B=NO的C=4、A=2下B=NO的C=2),会出现误标记。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 15:31:57