在两个数据帧上对列函数进行有效的熊猫操作

时间:2019-06-06 16:18:35

标签: python python-3.x pandas dataframe

我有两个数字数据框(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])

1 个答案:

答案 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_npmyfunc的numpy版本,直接作用于numpy数组,而不是熊猫系列。

要进一步提高性能,可能需要对myfunc_np进行矢量化处理,即让myfunc_np_vec占用u1中的一列df1和整个df2,并且返回u1df2中所有列的相似值向量。