使用 python 基于来自 DataFrame 的 2 个向量的函数创建新字段
Creating a new field from a function based on 2 vectors from a DataFrame using python
我有一个 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)
我正在考虑使用 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))
我有一个 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)
我正在考虑使用 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))