yp 找到的解决方案:
https://github.com/pydata/pandas/issues/3344#issuecomment-16533461
from pandas.util.testing import makeCustomDataframe as mkdf
a=mkdf(3,5,data_gen_f=lambda r,c: randint(1,100))
b=mkdf(5,3,data_gen_f=lambda r,c: randint(1,100))
c=DataFrame(a.values.dot(b.values),index=a.index,columns=b.columns)
print a
print b
print c
assert (a.iloc[0,:].values*b.iloc[:,0].values.T).sum() == c.iloc[0,0]
C0 C_l0_g0 C_l0_g1 C_l0_g2 C_l0_g3 C_l0_g4
R0
R_l0_g0 39 87 88 2 65
R_l0_g1 59 14 76 10 65
R_l0_g2 93 69 4 29 58
C0 C_l0_g0 C_l0_g1 C_l0_g2
R0
R_l0_g0 76 88 11
R_l0_g1 66 73 47
R_l0_g2 78 69 15
R_l0_g3 47 3 40
R_l0_g4 54 31 31
C0 C_l0_g0 C_l0_g1 C_l0_g2
R0
R_l0_g0 19174 17876 7933
R_l0_g1 15316 13503 4862
R_l0_g2 16429 15382 7284
这里的断言是没用的,它只是检查它确实是一个正确的矩阵乘法。
这里的关键似乎是第 4 行:
c=DataFrame(a.values.dot(b.values),index=a.index,columns=b.columns)
它的作用是计算 a 和 b 的点积,但强制生成的 DataFrame c 具有 a 的索引和 b 的列,确实将点积转换为矩阵乘法,并且采用 pandas 的风格,因为您保留了索引和列(你丢失了 a 的列和 b 的索引,但这在语义上是正确的,因为在矩阵乘法中你是对这些行求和,所以保留它们是没有意义的)。
这有点尴尬,但如果它与 API 的其余部分一致,这似乎很简单(我仍然需要测试 Series x Dataframe 和 Series x Series 的结果,我将在这里发布我的发现)。