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

