解决TypeError:字符串与浮点数无法比较的余弦相似度列计算问题
错误原因分析
报错核心是类型不兼容:df[cos_cols].idxmax(axis=1)返回的是列名字符串(比如articleScores1),你直接拿它和浮点数0.5做比较,自然触发TypeError。同时你的n_lar函数逻辑完全错误:apply是逐行处理单条数据,但你在函数里直接操作整个DataFrame,且没有正确返回值。
解决方法
推荐用向量化操作实现需求(比apply高效数倍,适合大数据集):
import numpy as np # 定义相似度列列表 cos_cols = [f"articleScores{i}" for i in range(1, 6)] # 计算每行的最大相似度数值、对应列名 max_sim_values = df[cos_cols].max(axis=1) max_sim_cols = df[cos_cols].idxmax(axis=1) # 生成目标列:按规则赋值 df['Most_similar_to'] = np.where( max_sim_values >= 0.5, max_sim_cols.str.replace('articleScores', 'CosineSim'), False )
代码解释
max_sim_values:提取每行5个相似度列中的最大值(数值类型,可直接和0.5比较)max_sim_cols:获取每行最大值对应的列名(如articleScores3)np.where:批量判断赋值:- 当最大值≥0.5时,把列名中的
articleScores替换为CosineSim,得到要求的CosineSimX格式 - 否则返回
False
- 当最大值≥0.5时,把列名中的
如果一定要用apply(不推荐,小数据集可用),需修改为逐行处理逻辑:
cos_cols = [f"articleScores{i}" for i in range(1, 6)] def get_most_similar(row): sim_vals = row[cos_cols] max_val = sim_vals.max() if max_val >= 0.5: target_col = sim_vals.idxmax() return target_col.replace('articleScores', 'CosineSim') return False df['Most_similar_to'] = df.apply(get_most_similar, axis=1)
内容的提问来源于stack exchange,提问作者Python-data
相关产品推荐
相关产品推荐

