如何在Pandas中基于列内列表值筛选DataFrame行?
嘿,我完全懂你碰到的这个麻烦!直接用列表和DataFrame的列做相等判断确实会踩坑,因为Pandas会默认把右侧的列表当成和列长度一致的序列来逐元素匹配,而不是检查每个行里的列表是否和目标列表完全相等,这就导致了那个长度不匹配的错误。
别担心,有几个比手动遍历高效得多的解决方案:
方法1:用apply()逐行判断列表相等
这是最直接的方式,利用apply()对list_value列的每个元素做相等判断,返回布尔值来筛选行:
import pandas as pd df = pd.DataFrame([['text1', [1,2,3]], ['text2', [2,3,4]]], columns=['text','list_value']) # 筛选list_value等于[1,2,3]的行 filtered_df = df[df['list_value'].apply(lambda x: x == [1,2,3])] print(filtered_df)
运行后会得到你想要的结果:
text list_value 0 text1 [1, 2, 3]
方法2:转成元组后直接匹配(更高效)
列表是不可哈希的,没法直接作为Pandas的比较对象,但元组可以。我们可以把列表列转成元组,然后直接用等于判断:
# 链式调用,无需新增列 filtered_df = df[df['list_value'].apply(tuple) == (1,2,3)] # 如果需要重复使用,也可以新增一列元组列 df['tuple_value'] = df['list_value'].apply(tuple) filtered_df = df.loc[df['tuple_value'] == (1,2,3)]
这个方法的性能比apply(lambda x: x == ...)更好,尤其是当你的DataFrame行数很多的时候。
为什么原来的代码会报错?
你之前写的df.loc[df['list_value'] == [1,2,3]],Pandas会把右侧的[1,2,3]当成一个长度为3的序列,而你的list_value列只有2个元素(两行),所以它尝试逐位置匹配时就会抛出Arrays were different lengths: 2 vs 3的错误——它根本没理解你是要检查每个行的列表是否等于目标列表。
内容的提问来源于stack exchange,提问作者Leoli
相关产品推荐
相关产品推荐

