Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 两个数据帧上列函数的高效操作

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彼此具有不同的长

我有两个数字数据帧(df1和df2),每个都有一个共同的索引,但有不同的列标题。我想应用一个函数:对于df1的第I列和df2的第j列,应用Pearson相关函数(或余弦相似性,或类似的用户定义函数),并返回数字

我想将数字返回到数据帧df3中,其中df1的列是df3的索引,df2的列是df3的列,单元格表示来自df1和df2的两个向量(列)之间的相关性值

*并不是所有的值都被填充。如果存在差异,则仅在两个向量的内部联接上进行匹配(这可以在用户定义的函数中完成)。假设df1和df2彼此具有不同的长度/列数

示例:我有一个男性约会档案的数据框(df1),其中列是男性的名字,行索引是他们对某个主题的兴趣,介于0到100之间

我有第二个数据帧(df2)的女性约会档案以同样的方式

我想返回一个矩阵,男性沿着侧面,女性穿过顶部,数字对应于两个侧面之间的相似系数,对于每一对男性/女性

例如: df1

df2

期望输出,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
我尝试了经典的双循环,但即使我知道这是撒旦在熊猫世界的工作。这些表格相对较大,因此合理的效率很重要(下面显然不是)。提前谢谢

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)