Python pandas:判断列表是否存在于DataFrame列时的报错问题
解决列表在DataFrame列中存在性判断的报错问题
报错原因
你用list in pos['id'].values的时候,pos['id'].values是个形状为(2,)的numpy数组,每个元素是长度3的列表。numpy会尝试把你的列表和数组做广播比较,但两者形状不兼容,直接抛出了形状不匹配的错误。
可行解决方案
方案1:转成Python原生列表判断
把DataFrame的id列转成普通Python列表,再用in操作符,这样会逐个对比列表元素,不会触发numpy的广播机制:
import pandas as pd pos = pd.DataFrame(columns=['id', 'pred']) pos.loc[1,'id'] = [4, 4, 4] pos.loc[2,'id'] = [2, 3, 3] list1 = [2, 3, 3] list2 = [3, 2, 3] # 转换为Python列表后执行判断 id_values = pos['id'].tolist() print(list1 in id_values) # 输出 True print(list2 in id_values) # 输出 False
方案2:用apply逐个元素对比
借助pandas的apply方法,对id列的每个元素和目标列表做相等判断,再用any()检查是否存在匹配项:
print(pos['id'].apply(lambda x: x == list1).any()) # 输出 True print(pos['id'].apply(lambda x: x == list2).any()) # 输出 False
方案3:重构DataFrame(推荐)
pandas的设计初衷是处理结构化数据,单元格存列表会导致很多操作不便。如果业务允许,建议把列表拆成多列存储,这样判断会更高效:
# 重新构造DataFrame,将原列表拆分为三列 pos = pd.DataFrame({ 'id_1': [4, 2], 'id_2': [4, 3], 'id_3': [4, 3], 'pred': [None, None] }) list1 = [2, 3, 3] # 对比整行是否与目标列表完全匹配 print((pos[['id_1', 'id_2', 'id_3']] == list1).all(axis=1).any()) # True list2 = [3, 2, 3] print((pos[['id_1', 'id_2', 'id_3']] == list2).all(axis=1).any()) # False
内容的提问来源于stack exchange,提问作者Vika
相关产品推荐
相关产品推荐

