我有两个数字数据框(df1 和 df2),每个数据框都有一个公共(public)索引,但列标题不同。我想应用一个函数:对于 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
我用经典的双 for 循环试过这个,但即使我知道这是 Pandas 世界中撒旦的杰作。这些表相对较大,因此合理的效率很重要(下面显然不是)。提前致谢。
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])
最佳答案
我已经尝试了您的代码的几个替代方案,这个是目前最快的:
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 数组而不是 pandas 系列。
进一步的性能改进可能需要向量化 myfunc_np
,即有一个 myfunc_np_vec
占用一列 u1
在 df1
和整个df2
, 并返回 u1
相似度值的向量所有列都在 df2
中同时。
关于python - 两个数据帧上列函数的高效 pandas 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481537/