Pandas如何筛选某列集合与参考集合存在交集的DataFrame行
错误原因
df['sets']取到的是完整的Series对象,intersection()是Python原生集合的专属方法,Series本身没有该方法,所以抛出属性错误。你之前的逻辑是想对Series里每个单元格的集合做计算,需要遍历每个元素触发集合的方法。
基础实现方案
# 生成筛选掩码:逐个判断每个集合与参考集合是否存在交集 filter_mask = df['sets'].apply(lambda x: len(x.intersection(reference_set)) > 0) # 筛选符合条件的行 result_df = df[filter_mask] # 额外计算交集长度 result_df['intersection_length'] = result_df['sets'].apply(lambda x: len(x.intersection(reference_set)))
大数据量性能优化(适配2500万行场景)
基础的apply是单线程遍历,处理2500万行速度偏慢,可做以下优化:
- 提前将
reference_set固定为集合类型,确保每次交集运算的哈希查找是O(1)复杂度 - 用集合运算符
&替代intersection()方法,写法更简洁,性能一致 - 单次遍历同时完成交集长度计算和筛选,避免重复遍历数据
优化后代码:
reference_set = set(reference_set) # 单次遍历完成计算+筛选,减少IO开销 result_df = df.assign( intersection_length = df['sets'].apply(lambda x: len(x & reference_set)) ).query("intersection_length > 0")
如果性能仍不满足要求,可以引入swifter库自动实现apply的多线程并行化,无需修改核心逻辑即可大幅提升处理速度。
内容的提问来源于stack exchange,提问作者bfalk
相关产品推荐
相关产品推荐

