python - 两个数据帧上列函数的高效 pandas 操作

标签 python python-3.x pandas dataframe

我有两个数字数据框(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_npmyfunc 的 numpy 版本直接作用于 numpy 数组而不是 pandas 系列。

进一步的性能改进可能需要向量化 myfunc_np ,即有一个 myfunc_np_vec占用一列 u1df1和整个df2 , 并返回 u1 相似度值的向量所有列都在 df2 中同时。

关于python - 两个数据帧上列函数的高效 pandas 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481537/

相关文章:

python - 如何检索列表中的 n 项组

python - 字典列表中所有键的联合

超过 Python Telegram Bot 洪水控制

python - Pandas Column 中有 NaN 的地方我想用 1 替换,除了 Totals 需要对 1 求和

pandas - 按年份分组并计算平均值并计算 pandas 的大小

python - 如何知道调用 shell 目录的路径并在我的 python 可执行文件中使用它

python - 带括号的正则表达式前瞻

python-3.x - 如何修复 "Celery is receiving tasks but while executing it stuck"

python-3.x - 无法在 Spyder 中调整编辑器窗口的大小

python - 在 for 循环期间删除列 - Pandas