python - 使用 python 从基于 DataFrame 的 2 个向量的函数创建一个新字段

标签 python pandas dictionary lambda cosine-similarity

我有一个 DataFrame,希望使用一个函数基于计算创建一个新字段,该函数采用从 DataFrame 的一行中获取的 2 个向量。

例如,我的数据如下所示;

df = pd.DataFrame({
    "A": [1,2,3,4,5],
    "B": [6,7,8,9,10],
    "C": [7,8,1,9,10],
    "D": [2,3,4,5,6],
 })

我想逐行计算[A,B].[C,D]cosine_similarity,然后将结果输出为新的列E

我的功能如下;

import sklearn as sk
from sklearn.metrics import pairwise as pw

def similarity(Vec1, Vec2):
    return pw.cosine_similarity(Vec1,Vec2)

我正在考虑使用 maplambda 函数,目前有以下功能。这里的问题是,这是计算沿列的余弦相似度,而不是跨列的余弦相似度。我真的希望能够使用索引来做到这一点,这样我就可以选择我需要的字段,以防字段数量变得非常大!

df['E'] = map(lambda x,y : similarity(x,y), df.iloc[:,2:], df.iloc[:,:2])

最佳答案

这是一种方法:

import numpy as np
import sklearn as sk
from sklearn.metrics import pairwise as pw

df = pd.DataFrame({
    "A": [1,2,3,4,5],
    "B": [6,7,8,9,10],
    "C": [7,8,1,9,10],
    "D": [2,3,4,5,6],
 })

df['E'] = df.apply(lambda row: pw.cosine_similarity(np.array([row['A'], row['B']]),
                   np.array([row['C'], row['D']]))[0][0], axis=1)

#    A   B   C  D         E
# 0  1   6   7  2  0.429057
# 1  2   7   8  3  0.594843
# 2  3   8   1  4  0.993533
# 3  4   9   9  5  0.798815
# 4  5  10  10  6  0.843661

更容易扩展的解决方案:

df['E'] = [pw.cosine_similarity(i, j)[0][0] for i, j in \
           zip(df[df.columns[:2]].values, df[df.columns[2:]].values)]

功能替代:

df['E'] = list(map(lambda i, j: pw.cosine_similarity(i, j)[0][0],
                   df[df.columns[:2]].values,
                   df[df.columns[2:]].values))

关于python - 使用 python 从基于 DataFrame 的 2 个向量的函数创建一个新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49009475/

相关文章:

python - 防止导入的模块出现在代码完成中?

python - 如何将 csv 转换为嵌套 json

python - 检查 Pandas 列值包含在列表中并分配一个值

python - 如何使用其他字典的值累积更新字典?

使用STL map的运算符[]时android ndk崩溃

python - 多次实例化时 asyncio Lock 中的事件循环错误

python - 使用for循环打印值django模板

python - 有没有一种方法可以根据值从 Pandas DataFrame 中提取索引

python - 对象与字典 : how to organise a data tree?

python - 如何从 pandas 数据框创建词袋