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

如何用Pandas groupby.filter()实现组内条件过滤移除指定行?

Pandas 分组过滤需求实现方法

原始数据

import pandas as pd

df = pd.DataFrame({
    "Part Number" : [123456, 123456, 123456, 123456, 987654, 987654, 987654, 987654, 654321, 654321, 654321, 654321],
    "Operation" : [0, 100, 200, 300, 0, 100, 200, 300, 0, 100, 200, 300],
    "Source" : ["A", "A", "A", "A", "A", "B", "A", "A", "B", "B", "B", "B"]
})

需求说明

按Part Number分组后:

  • 若组内存在Source=="A"的行,移除该组所有Source=="B"的行
  • 若组内无"A",保留全部行

此前尝试用df.groupby("Part Number").filter(lambda x: (x["Source"] == "A").count() > 0)未达预期,且不想用循环实现。

预期输出

pd.DataFrame({
    "Part Number" : [123456, 123456, 123456, 123456, 987654, 987654, 987654, 654321, 654321, 654321, 654321],
    "Operation" : [0, 100, 200, 300, 0, 200, 300, 0, 100, 200, 300],
    "Source" : ["A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B"]
})

解决方案

groupby().filter()的作用是保留或删除整个分组,无法实现仅删除分组内部分行的需求。可以通过groupby.transform()生成标记列,再结合布尔索引实现需求:

# 标记每个行所在分组是否存在Source="A"
has_a = df.groupby("Part Number")["Source"].transform(lambda x: (x == "A").any())

# 构造过滤条件:分组无A则全部保留;分组有A则仅保留Source为A的行
filtered_df = df[(~has_a) | (df["Source"] == "A")]

执行后filtered_df与预期输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:17:27