You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅计算两个Pandas DataFrame的两两组合点积?

优雅实现Pandas DataFrame列间两两点积

当然有非常优雅的实现方式,完全不需要手动遍历!其实这个需求本质上就是矩阵乘法,利用Pandas自带的方法就能一行代码搞定,还能自动保留我们需要的行和列标签。

核心实现思路

我们要计算的是df_1中每一个"c"列与df_2中每一个"u"列的点积,这正好对应矩阵乘法中:df_1的转置(把列转成行)与df_2相乘的结果。因为矩阵乘法里,结果的(i,j)位置元素就是第一个矩阵的第i行向量和第二个矩阵的第j列向量的点积,完美匹配我们的需求。

完整代码示例

import pandas as pd
import numpy as np

# 初始化两个DataFrame
df_1 = pd.DataFrame({"c1":[2,3,5,0], "c2":[1,0,5,2], "c3":[8,1,5,1]}, index=[1,2,3,4])
df_2 = pd.DataFrame({"u1":[1,0,1,0], "u2":[-1,0,1,1]}, index=[1,2,3,4])

# 一行代码计算所有两两组合点积
result = df_1.T.dot(df_2)

print(result)

运行后输出的结果完全符合你的期望:

u1  u2
c1   7   3
c2   6   6
c3  13  -2

为什么这比遍历更优?

  1. 代码简洁:不需要写嵌套循环或者列名遍历逻辑,可读性极强;
  2. 效率更高:Pandas的dot方法底层调用了numpy的优化线性代数运算,比Python手动遍历快几个数量级,尤其是数据量较大时优势明显;
  3. 自动保留标签:结果会自动继承df_1的列名作为行索引,df_2的列名作为结果的列名,完全不需要手动设置。

如果习惯用numpy的话,也可以用np.dot(df_1.T, df_2),结果是一样的numpy数组,再转成DataFrame即可,但直接用Pandas的dot方法更省心。

内容的提问来源于stack exchange,提问作者d_gnz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:12:56