我有两个数字数据框(df1和df2),每个都有共同的索引,但具有不同的列标题。我想应用一个函数:对于df1的第i列和df2的第j列,应用Pearson相关函数(或余弦相似度,或类似的用户定义函数),并返回数字。
我想将数字返回到数据帧df3中,其中df1的列是df3的索引,df2的列是df3的列,单元格表示两个向量之间的相关性值( df1和df2中的列)。
*并非所有值都已填充。如果存在差异,则仅在两个向量的内部联接上进行匹配(可以在用户定义的函数中完成)。假设df1和df2具有彼此不同的长度/列数。
示例:我有一个男性约会档案的数据框(df1),其中列是男性的名字,行索引是他们对某个主题的兴趣,介于0和100之间。
我以同样的方式拥有女性约会档案的第二个数据帧(df2)。
我想在侧面返回一个“男性”矩阵,在顶部返回“女性”,并且该数字对应于每个男人/女人对的两个配置文件之间的相似系数。
例如: df1
bob joe carlos
movies 50 45 90
sports 10 NaN 10
walking 20 NaN 50
skiing NaN 80 40
df2
mary anne sally
movies 40 70 NaN
sports 50 0 30
walking 80 10 50
skiing 30 NaN 40
所需的输出df3:
mary anne sally
bob 4.53 19.3 77.4
joe 81.8 75.7 91.0
carlos 45.8 12.2 18.8
我使用经典的double for循环尝试了此操作,但即使我也知道这是熊猫世界中撒旦的作品。这些表相对较大,因此合理的效率很重要(以下内容显然并不重要)。预先感谢。
df3 = pd.DataFrame(index=df1.columns, columns=df2.columns)
for usera in df1:
for userb in df2:
df3.loc[userb, usera] = myfunc(df1[usera], df2[userb])
答案 0 :(得分:1)
我已经尝试了一些代码替代方法,并且这是目前最快的方法:
df3 = pd.DataFrame(([myfunc_np(col_a, col_b) for col_b in df2.values.T] for col_a in df1.values.T),
index=df1.columns, columns=df2.columns)
这里myfunc_np
是myfunc
的numpy版本,直接作用于numpy数组,而不是熊猫系列。
要进一步提高性能,可能需要对myfunc_np
进行矢量化处理,即让myfunc_np_vec
占用u1
中的一列df1
和整个df2
,并且返回u1
与df2
中所有列的相似值向量。