Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python基于数据帧中的2个向量从函数创建新字段_Python_Pandas_Dictionary_Lambda_Cosine Similarity - Fatal编程技术网

使用python基于数据帧中的2个向量从函数创建新字段

使用python基于数据帧中的2个向量从函数创建新字段,python,pandas,dictionary,lambda,cosine-similarity,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]的余弦u相似性,然后将结果输出为新列E 我的功能如下 import sklearn as sk f

我有一个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]
余弦u相似性
,然后将结果输出为新列
E

我的功能如下

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

def similarity(Vec1, Vec2):
    return pw.cosine_similarity(Vec1,Vec2)
我正在考虑使用
map
lambda
函数,目前有以下功能。这里的问题是,这是沿列计算余弦相似性,而不是跨列计算。真的,我希望能够做到这一点,使用索引,这样我就可以选择我需要的字段,以防字段的数量变得非常大

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))

这是伟大的,但我真的希望能够做到这一点,使用索引。如果余弦相似性中需要包含的字段数量变得非常大,该怎么办?可扩展解决方案可以做到这一点,但我正在寻找一种更通用的方法,将我问题中的函数应用于来自数据帧的2个向量:)谢谢!和我的差不多。我很感兴趣,
[0][0]
是做什么的?我不知道为什么,但是
pw.cosine\u相似度
函数的输出是一个形状/格式的向量
[[23.4121]]
,所以为了提取数字部分,我取第一个元素的第一个元素。啊,是的!我也注意到了。有道理!谢谢