如何优雅计算两个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
为什么这比遍历更优?
- 代码简洁:不需要写嵌套循环或者列名遍历逻辑,可读性极强;
- 效率更高:Pandas的
dot方法底层调用了numpy的优化线性代数运算,比Python手动遍历快几个数量级,尤其是数据量较大时优势明显; - 自动保留标签:结果会自动继承
df_1的列名作为行索引,df_2的列名作为结果的列名,完全不需要手动设置。
如果习惯用numpy的话,也可以用np.dot(df_1.T, df_2),结果是一样的numpy数组,再转成DataFrame即可,但直接用Pandas的dot方法更省心。
内容的提问来源于stack exchange,提问作者d_gnz
相关产品推荐
相关产品推荐

