如何基于嵌套列表筛选pandas DataFrame中存储列表类型的列
问题排查与解决
原有写法的问题
- 核心报错原因:
pandas.Series.isin()方法要求判断的目标元素是可哈希类型,列表属于可变不可哈希类型,所以直接用列表做归属判断会触发TypeError: unhashable type: 'list'错误。 - 安全隐患:使用
eval()解析字符串的方案风险极高,遇到异常转义的字符串可能执行任意恶意代码,生产环境禁止使用。 - 偶发运行成功的原因:大概率是低版本pandas的特殊兼容逻辑,属于不可复现的边缘情况,不具备通用性。
最优实现方案
首先预处理匹配列表slist,将所有子列表转成小写元组后存储为集合,匹配效率比列表判断高一个数量级:
# 预处理匹配规则:统一转小写+转可哈希元组+存为集合 match_set = set(tuple(item.lower() for item in sub_list) for sub_list in slist) # 过滤DataFrame:把path列的每个列表转小写元组,判断是否在匹配集合中 df = df[df['path'].apply(lambda x: tuple(item.lower() for item in x) in match_set)]
运行上述代码即可得到你期望的输出结果,同时兼容所有pandas版本,没有安全风险,性能也远高于原有写法。
内容的提问来源于stack exchange,提问作者NAB0815
相关产品推荐
相关产品推荐

