You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算DataFrame两列余弦相似度时遇ValueError问题求助

分析与解决

这个错误不是由cosine similarity函数的功能本身导致的,核心问题出在数据异常和apply方法的返回值上:

  • 关键错误提示是ValueError: Wrong number of items passed 9, placement implies 1,说明cal_cosine_similarity函数对某一行返回了9个元素的结果,而非单个数值,导致pandas无法将多元素值插入到单列cos_sim中。
  • 触发原因大概率是:sup_vec或vector列中存在异常数据——比如某行的向量不是一维数组,而是包含9个元素的二维数组,或是格式错误的可迭代对象。经np.array()转换后传入cosine_similarity,返回的结果变成了9元素数组,最终导致赋值失败。
  • 前面的KeyError: 'cos_sim'是赋值失败引发的连锁错误,并非根源问题。

修复方案

  • 添加数据校验:在函数内检查向量维度,确保是一维数组,遇到异常数据返回默认值(如NaN):
def cal_cosine_similarity(row):
    vec1 = np.array(row['sup_vec'])
    vec2 = np.array(row['vector'])
    # 校验向量维度为一维,且长度一致
    if vec1.ndim != 1 or vec2.ndim != 1 or len(vec1) != len(vec2):
        return np.nan
    return cosine_similarity([vec1], [vec2])[0][0]
  • 提前清洗数据:计算前过滤掉sup_vec或vector列中格式异常的行(假设正常向量是长度为N的列表):
# 替换N为实际的向量长度
cross_join_df = cross_join_df[cross_join_df['sup_vec'].apply(lambda x: isinstance(x, list) and len(x) == N)]
cross_join_df = cross_join_df[cross_join_df['vector'].apply(lambda x: isinstance(x, list) and len(x) == N)]
  • 改用批量计算提升效率:避免逐行apply,直接对整列向量批量计算,既快又能减少异常触发点:
from sklearn.metrics.pairwise import cosine_similarity

# 将列中的向量转换为二维数组
vecs1 = np.array(cross_join_df['sup_vec'].tolist())
vecs2 = np.array(cross_join_df['vector'].tolist())
# 批量计算对角线的余弦相似度(对应每行的两个向量)
cross_join_df['cos_sim'] = cosine_similarity(vecs1, vecs2).diagonal()

内容的提问来源于stack exchange,提问作者dhananjay sangle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:32:03