Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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 将自定义函数应用于数据帧中的每个列组合_Python_Pandas_Dataframe_Lambda - Fatal编程技术网

Python 将自定义函数应用于数据帧中的每个列组合

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

我试图计算熊猫数据框中每个列组合之间的余弦相似性。我已经编写了一个自定义函数来计算余弦相似性,现在需要将它应用于每一对列的组合。如果用户未与其进行交互,则每列包含一个0,如果用户进行交互,则每列包含一个1。因此,每一行都包含用户的总查看行为

目前正在使用for循环,但是对于较大的数据样本来说太慢了-例如,我当前的样本是3408列x 28000行

我的猜测是lambda函数是可行的,但我不确定如何正确应用它

初始数据帧:

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中的成对计算可以很好地解决这个问题,并且消除了循环的需要。你很好!我只是本着这个网站的精神写了一个答案,以便其他有类似问题的人能够找到解决办法。