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
相关产品推荐
相关产品推荐

