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

