Python 两个数据帧上列函数的高效操作
我有两个数字数据帧(df1和df2),每个都有一个共同的索引,但有不同的列标题。我想应用一个函数:对于df1的第I列和df2的第j列,应用Pearson相关函数(或余弦相似性,或类似的用户定义函数),并返回数字 我想将数字返回到数据帧df3中,其中df1的列是df3的索引,df2的列是df3的列,单元格表示来自df1和df2的两个向量(列)之间的相关性值 *并不是所有的值都被填充。如果存在差异,则仅在两个向量的内部联接上进行匹配(这可以在用户定义的函数中完成)。假设df1和df2彼此具有不同的长度/列数 示例:我有一个男性约会档案的数据框(df1),其中列是男性的名字,行索引是他们对某个主题的兴趣,介于0到100之间 我有第二个数据帧(df2)的女性约会档案以同样的方式 我想返回一个矩阵,男性沿着侧面,女性穿过顶部,数字对应于两个侧面之间的相似系数,对于每一对男性/女性 例如: df1 df2 期望输出,df3:Python 两个数据帧上列函数的高效操作,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有两个数字数据帧(df1和df2),每个都有一个共同的索引,但有不同的列标题。我想应用一个函数:对于df1的第I列和df2的第j列,应用Pearson相关函数(或余弦相似性,或类似的用户定义函数),并返回数字 我想将数字返回到数据帧df3中,其中df1的列是df3的索引,df2的列是df3的列,单元格表示来自df1和df2的两个向量(列)之间的相关性值 *并不是所有的值都被填充。如果存在差异,则仅在两个向量的内部联接上进行匹配(这可以在用户定义的函数中完成)。假设df1和df2彼此具有不同的长
mary anne sally
bob 4.53 19.3 77.4
joe 81.8 75.7 91.0
carlos 45.8 12.2 18.8
我尝试了经典的双循环,但即使我知道这是撒旦在熊猫世界的工作。这些表格相对较大,因此合理的效率很重要(下面显然不是)。提前谢谢
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\u np
是myfunc
的numpy版本,它直接作用于numpy数组,而不是熊猫系列
进一步的性能改进可能需要向量化
myfunc\u np
,即拥有一个myfunc\u np\u vec
,它在df1
中占据一列u1
和整个df2
,并返回一个u1
的相似性值向量,同时返回df2
中的所有列。也许内置的工具可以帮助我?我爱这个社区+熊猫公司乐于助人的人。谢谢@G.Anderson,让我试试看,看看我过得怎么样。它看起来会满足我的需要。我总是说:如果你想在熊猫身上做任何事情,几乎总是有一个内置函数,而且总是比我想出的更好。因为某种原因,corrwith
只给了我一系列的NaN
。是的,我也不能让它为我工作,axis=0给出了一个空序列,axis=1给出了一系列NaN(尽管我认为它应该是axis=0)
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)