Python 将自定义函数应用于数据帧中的每个列组合
我试图计算熊猫数据框中每个列组合之间的余弦相似性。我已经编写了一个自定义函数来计算余弦相似性,现在需要将它应用于每一对列的组合。如果用户未与其进行交互,则每列包含一个0,如果用户进行交互,则每列包含一个1。因此,每一行都包含用户的总查看行为 目前正在使用for循环,但是对于较大的数据样本来说太慢了-例如,我当前的样本是3408列x 28000行 我的猜测是lambda函数是可行的,但我不确定如何正确应用它 初始数据帧:Python 将自定义函数应用于数据帧中的每个列组合,python,pandas,dataframe,lambda,Python,Pandas,Dataframe,Lambda,我试图计算熊猫数据框中每个列组合之间的余弦相似性。我已经编写了一个自定义函数来计算余弦相似性,现在需要将它应用于每一对列的组合。如果用户未与其进行交互,则每列包含一个0,如果用户进行交互,则每列包含一个1。因此,每一行都包含用户的总查看行为 目前正在使用for循环,但是对于较大的数据样本来说太慢了-例如,我当前的样本是3408列x 28000行 我的猜测是lambda函数是可行的,但我不确定如何正确应用它 初始数据帧: sm\u views=pd.read\u sql(postgreSQL\u
sm\u views=pd.read\u sql(postgreSQL\u select\u查询,连接).groupby().size().unstack(fill\u value=0)
Cos评级功能:
def cos_rating_计算器(x,y):
点积=np.dot(x,y)
距离1=np.sqrt(和(x))
距离2=np.sqrt(和(y))
cos_评级=点产品/(距离1*距离2)
返回cos_评级
用于计算关联组合的代码:
combines=list(itertools.combines(sm_views.columns,2))
结果=[]
对于组合中的a、b:
关联度量=cos评分计算器(sm视图[a]、sm视图[b])
结果。追加((a,b,关联度量))
结果。追加((b,a,关联度量))
to_matrix=pd.DataFrame(结果,列=['a','b','association'])
关联矩阵=到矩阵透视图(索引='a',列='b',值='association')
对于较小的数据集,这种方法很好,但是当前数据集太大,这种方法不可行。我想要的输出是一个x列矩阵,列之间的关联度作为值
import scipy.spatial.distance
result = pd.DataFrame(list(itertools.combinations(sm_views.columns, 2)), columns=['a','b'])
result['association'] = scipy.spatial.distance.pdist(sm_views.T, 'cosine')
使用此示例sm_视图:
col1 col2 col3
0 0 0 0
1 3 4 2
2 1 1 5
我们得到
a b association
0 col1 col2 0.002946
1 col1 col3 0.354058
2 col2 col3 0.414509
使用此示例sm_视图:
col1 col2 col3
0 0 0 0
1 3 4 2
2 1 1 5
我们得到
a b association
0 col1 col2 0.002946
1 col1 col3 0.354058
2 col2 col3 0.414509
也许使用可以加快一点计算速度,但我想速度增益不会太大。@Stef谢谢你的提示。scipy空间中的pdist或sklearn中的成对计算可以很好地解决这个问题,并且消除了循环的需要。你很好!我只是本着这个网站的精神写了一个答案,以便其他有类似问题的人可以找到解决方案。也许使用可以加快计算速度,但我想速度不会太快。@Stef谢谢你的提示。scipy空间中的pdist或sklearn中的成对计算可以很好地解决这个问题,并且消除了循环的需要。你很好!我只是本着这个网站的精神写了一个答案,以便其他有类似问题的人能够找到解决办法。