You need to enable JavaScript to run this app. Python中如何用Lambda替换嵌套for循环计算DataFrame列余弦相似度
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何用Lambda替换嵌套for循环计算DataFrame列余弦相似度

替代嵌套循环的实现方案

嵌套循环性能差的核心原因是纯Python循环没有利用pandas的向量化特性,用两层apply+lambda可以在pandas原生框架下替代嵌套for循环,代码更简洁性能也更好。

你可以直接用以下lambda写法实现完全等价的逻辑:

# 行索引对应input_df的索引,列索引对应data1的索引,单元格值为对应两个文本的余弦相似度
similarity_df = input_df['Summary'].apply(lambda x: data1['Summary'].apply(lambda y: cosine_sim(x, y)))

加入后续操作的实现

你可以直接把后续操作封装为独立函数,嵌入到lambda的计算链路中,示例如下:

def post_process(score):
    # 此处可替换为你需要的任意后续逻辑,比如阈值过滤、结果存储、衍生字段计算等
    print(score)
    if score > 0.8:
        return "高相似"
    elif score > 0.5:
        return "中相似"
    else:
        return "低相似"

# 计算相似度同时执行后续处理
processed_result = input_df['Summary'].apply(
    lambda x: data1['Summary'].apply(
        lambda y: post_process(cosine_sim(x, y))
    )
)

更高性能的优化方案

如果你的cosine_sim是通用文本余弦相似度计算,还可以直接用向量化批量计算,性能比lambda+apply高10~100倍,适合数据量较大的场景:

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer

# 训练文本向量化器
all_corpus = pd.concat([input_df['Summary'], data1['Summary']])
vectorizer = TfidfVectorizer().fit(all_corpus)

# 批量转向量
input_vec = vectorizer.transform(input_df['Summary'])
data1_vec = vectorizer.transform(data1['Summary'])

# 一行计算所有两两相似度,得到的矩阵和前述similarity_df的数值完全一致
similarity_matrix = cosine_similarity(input_vec, data1_vec)

内容的提问来源于stack exchange,提问作者Aditya sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 12:57:03