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

Python检查DataFrame列是否含各嵌套子列表至少n个元素

pandas嵌套列表匹配筛选实现

需求说明

DataFrame中某一列存储列表类型值,需要实现通用校验逻辑:

  • 给定嵌套列表lstOflst,其中包含多个子列表
  • 自定义参数n为正整数,要求目标列的列表值,与lstOflst中每一个子列表的公共元素数量都≥n
  • 示例场景下n=1,预期筛选结果为C列值是['x','g','1']的行,因为该行C列和所有子列表都至少有1个共有元素

示例基础代码:

import pandas as pd
lstOflst = [['a', '5', '3', 'x'], ['1', 'e'], ['g', '7','x']]
data = [
    ['a', 'b', ['1','2','a'], '2d'],
    ['d', 'c', ['2','3','e'], '3b'],
    ['a', 'e', ['x','g','1'], '6a']
]
cols = ['A', 'B', 'C', 'D']
df = pd.DataFrame(data, columns=cols)

原有代码错误点

之前编写的报错代码存在三个核心问题:

  • 嵌套列表的子列表是不可哈希对象,直接执行set(lstOflst)会触发类型错误,无法生成集合
  • 逻辑只做了单个集合的交集判断,没有实现「每个子列表分别校验匹配数量」的要求,和需求不匹配
  • 目标列C本身存储的就是列表对象,不需要调用split()方法,强行调用会触发属性报错

通用可复用实现

实现思路:提前把所有待匹配子列表转为集合,降低交集计算的时间开销;逐行校验目标列值,判断所有子列表的交集长度都满足阈值要求,最终用布尔掩码筛选原DataFrame即可。

def filter_nested_list_match(df, target_col, nested_check_lst, match_n=1):
    # 预转换所有待匹配子列表为集合,优化计算效率
    check_sub_sets = [set(sub) for sub in nested_check_lst]
    # 生成逐行校验的布尔掩码
    match_mask = df[target_col].apply(
        lambda cell_val: all(
            len(set(cell_val) & sub_set) >= match_n 
            for sub_set in check_sub_sets
        )
    )
    return df[match_mask]

# 调用示例,n=1时获取符合要求的行
result = filter_nested_list_match(
    df, 
    target_col='C', 
    nested_check_lst=lstOflst, 
    match_n=1
)

运行上述代码,返回结果完全符合预期,只保留C列值为['x','g','1']的行。如果需要调整每个子列表的最少匹配元素数,直接修改match_n参数传入对应正整数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:18:16