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

如何移除Pandas中包含指定值的列表型数据行?

删除Pandas DataFrame中包含指定列表任意值的行

问题描述

需要删除DataFrame中所有ID列列表包含指定列表lst内任意值的行,输入数据如下:

import pandas as pd

df = pd.DataFrame({
    "ID": [
        [12, 1383],
        [2898, 1871, 223],
        [2855, 519, 12],
        [55, 519],
        [1230, 89564, 1247]
    ],
    "number": [1,2,3,4,5]
})
lst = [12, 55]

期望输出保留ID列表不含12或55的行:

# 输出结果
          ID  number
1  [2898, 1871, 223]       2
4  [1230, 89564, 1247]       5

原有方案的局限

你给出的列表推导式df = [k for k in df['ID'] if not any(j in lst for j in k)]只能提取ID列的有效列表,会丢失其他列数据,且无法保留DataFrame结构,不适用于多列或需要后续数据处理的场景。

通用解决方案

方法1:apply+布尔索引(基础通用)

通过apply遍历ID列的每个列表,判断是否包含目标值,生成布尔掩码后过滤行:

# 生成掩码:ID列表不包含lst中任何值的行标记为True
mask = df['ID'].apply(lambda x: not any(val in lst for val in x))
# 过滤数据
filtered_df = df[mask]

这个方法保留了DataFrame的完整结构,适用于大多数常规场景。

方法2:集合交集优化(高效版)

当lst元素较多时,用集合交集判断效率更高:

# 将目标列表转为集合,提升查找速度
lst_set = set(lst)
# 判断ID列表与目标集合无交集
mask = df['ID'].apply(lambda x: len(set(x) & lst_set) == 0)
filtered_df = df[mask]

集合的查找和交集运算比列表遍历更快,适合处理大数据量的情况。

方法3:自定义函数(可扩展版)

如果需要扩展到多列判断或更复杂的逻辑,可以用自定义函数结合行级apply:

def exclude_rows_with_match(row, target_col, exclude_set):
    # 判断目标列的集合与排除集合无交集
    return len(set(row[target_col]) & exclude_set) == 0

lst_set = set(lst)
# 按行应用函数,生成掩码
mask = df.apply(exclude_rows_with_match, axis=1, target_col='ID', exclude_set=lst_set)
filtered_df = df[mask]

这种方式灵活性更强,方便后续修改判断逻辑或扩展到其他列。

内容的提问来源于stack exchange,提问作者Mr.Slow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:20:31