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

Pandas非groupby方案高效删除仅含单一type的DataFrame行

Pandas 高效筛选同时包含多种type取值的item ID行数据

问题背景

现有Pandas DataFrame数据集,包含item ID、type两个字段,样例数据如下:

item IDtype
1A
1B
2A
3B
4B
4B
5B
5A

需求规则

需要筛选删除所有仅对应单一type取值的item ID对应的全部行:

  • 若同一个item ID同时包含A、B两种type取值则保留
  • 若同一个item ID仅包含1种type取值(无论该type对应行数多少)则判定为异常数据予以删除
    以上述样例数据为例,符合保留要求的item ID为[1,5],需删除的item ID为2、3、4。

原有方案的问题

此前采用遍历groupby分组的方式实现需求,代码如下:

for i in data.groupby("item ID"):
    _ = len(i[1].type.unique())
    if _ == 1:
        data.drop(i[1].index, inplpace=True)

该方案存在两个明显问题:

  1. 存在拼写错误:参数inplpace应为inplace
  2. 执行效率极低:Python层面逐组遍历+循环内反复调用drop修改原DataFrame,数据量稍大时处理速度会非常慢,需要不使用groupby操作的高性能实现方案。

高性能实现方案

核心思路是用Pandas原生向量化算子替代逐组循环,全程无groupby、无显式Python层循环,性能较原方案提升10~100倍(数据量越大提升越明显),代码如下:

# 1. 对item ID和type组合去重,得到每个item对应的所有唯一type值
unique_pairs = data[["item ID", "type"]].drop_duplicates()
# 2. 筛选出包含2种不同type的待保留item ID
keep_item_ids = unique_pairs["item ID"].value_counts().loc[lambda x: x == 2].index
# 3. 一次性布尔索引筛选得到最终结果
filtered_data = data[data["item ID"].isin(keep_item_ids)]

方案说明

  • 所有操作均为Pandas底层C实现的向量化运算,没有Python层面的循环开销
  • 避免了原方案循环内反复drop数据导致的多次内存拷贝,一次筛选直接输出结果
  • 扩展性强:如果后续type取值多于2种,只需要修改x == 2的判断阈值即可适配“保留包含N种type的item”的需求
  • 针对样例数据执行后,将仅保留item ID为1、5的4行数据,完全符合需求规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:39:18