如何按列表筛选包含列表行的Pandas DataFrame?
解决Pandas列表列与目标列表匹配的问题
嘿,你遇到的这个问题其实是Pandas比较逻辑的小坑:直接用==对比Series里的列表和单个列表时,Pandas会把目标列表当成和Series长度一致的序列,逐位置逐个元素比较,而不是判断整个列表是否完全相等。所以你才会得到全False的结果,下面给你几种靠谱的解决方法:
方法1:用apply直接判断列表相等
这是最直观的方式,对a列的每个列表元素直接做相等判断:
ds['a'].apply(lambda x: x == [1, 2])
执行后就能得到你想要的结果:
0 True 1 False Name: a, dtype: bool
方法2:用map替代apply(效果一致)
和apply逻辑类似,map也能遍历每个元素做判断,写法稍微简洁点:
ds['a'].map(lambda x: x == [1, 2])
输出结果和上面完全相同。
方法3:转成元组后比较(适合高频比较场景)
如果需要多次做这类列表匹配,可以先把列表列转换成元组(元组是可哈希类型,Pandas支持直接元素级比较):
# 先新增一列存转换后的元组 ds['a_tuple'] = ds['a'].apply(tuple) # 直接用==对比元组 ds['a_tuple'] == (1, 2)
得到的结果:
0 True 1 False Name: a_tuple, dtype: bool
这种方式的优势是后续重复比较时效率更高,不用每次都调用apply。
为啥直接==不行?
再给你补个小解释:当你运行ds.a == [1,2]时,Pandas会把[1,2]拆解成两个元素,尝试把ds.a的第一个列表[1,2]和1对比,第二个列表[3,4]和2对比——这显然不是你要的“整个列表匹配”逻辑,所以结果全是False啦。
内容的提问来源于stack exchange,提问作者skam
相关产品推荐
相关产品推荐

