Python中测试Dataframe内容真值时如何解决ValueError?
解决Pandas中检查列表列是否存在于目标列表的ValueError问题
这个坑我之前踩过!你遇到的ValueError本质是两个问题导致的:一是直接拿整个pandas.Series和普通列表做成员判断,二是从CSV读进来的3_tags列大概率是字符串形式的列表,不是真正的列表对象,没法直接和temp1里的列表做比较。
问题拆解
- 你写的
q = a['3_tags']得到的是一个Series对象,q in temp1是在判断「整个Series是不是temp1的一个元素」,这完全不是你要的逐行检查逻辑,Pandas会因为无法解析这种比较抛出ValueError。 - 从CSV读取数据时,列表会被自动转成字符串(比如
"['WP', 'VBD', 'DT']"),就算你想逐行比较,字符串和列表也永远不相等。
分步解决方案
1. 先把字符串形式的列表转成真正的列表
用ast.literal_eval可以安全地把字符串解析成对应的Python对象:
import pandas as pd import ast # 读取数据 a = pd.read_csv('sentences.csv') # 将字符串格式的列表转换为实际的列表对象 a['3_tags'] = a['3_tags'].apply(ast.literal_eval)
2. 逐行检查每个列表是否在temp1中
直接用apply遍历每行的3_tags元素,判断是否在目标列表里。如果数据量较大,建议把temp1转成元组的集合(因为列表不可哈希,不能直接存入集合),这样查找效率会更高:
temp1 = [ ['WP', 'VBD', 'DT'], ['WRB', 'JJ', 'VBZ'], ['WP', 'VBD', 'DT'] ] # 转换为元组集合,优化查找性能 temp_set = set(tuple(item) for item in temp1) # 逐行判断,生成新列标记结果 a['is_in_temp1'] = a['3_tags'].apply(lambda x: tuple(x) in temp_set)
如果数据量很小,也可以直接用原列表判断(效率稍低,但代码更直观):
a['is_in_temp1'] = a['3_tags'].apply(lambda x: x in temp1)
验证结果
运行完上面的代码后,你的DataFrame会新增一列is_in_temp1,每行的值是True或False,对应该行的3_tags是否存在于temp1中。
内容的提问来源于stack exchange,提问作者twhale
相关产品推荐
相关产品推荐

