在NumPy中向量化成对的列元素乘积

时间:2019-11-06 18:23:29

标签: python pandas numpy linear-algebra numpy-broadcasting

我有两个DataFrame:

>>> d1

    A  B
0   4  3
1   5  2
2   4  3

>>> d2

    C  D  E
0   1  4  7
1   2  5  8
2   3  6  9

>>> what_I_want

    AC  AD  AE  BC  BD  BE
0   4   16  28  3   12  21
1   10  25  40  4   10  16
2   12  24  36  9   18  27

两个DataFrame具有相同的行数(例如m),但是具有不同的列数(例如ncol_1,ncol_2)。输出是一个m乘(ncol_1 * ncol_2)DataFrame。每列是d1中的一列和d2中的一列的乘积。

我遇到过np.kron,但是它并没有达到我想要的效果。我的实际数据有数百万行。

我想知道是否有矢量化的方法?我目前有一个itertools.product的实现,但是速度却非常慢。

2 个答案:

答案 0 :(得分:8)

一个与NumPy-broadcasting-

a = d1.to_numpy(copy=False) # d1.values on older pandas versions
b = d2.to_numpy(copy=False)
df_out = pd.DataFrame((a[:,:,None]*b[:,None,:]).reshape(len(a),-1))
df_out.columns = [i+j for i in d1.columns for j in d2.columns]

对于大数据,将multi-coresnumexpr结合使用-

import numexpr as ne

out = ne.evaluate('a3D*b3D',{'a3D':a[:,:,None],'b3D':b[:,None]}).reshape(len(a),-1)
df_out = pd.DataFrame(out)

答案 1 :(得分:3)

IIUC,使用for循环并不总是不好,check

pd.DataFrame({x+y: df1[x]*df2[y]  for x in df1 for y in df2})
Out[81]: 
   AC  AD  AE  BC  BD  BE
0   4  16  28   3  12  21
1  10  25  40   4  10  16
2  12  24  36   9  18  27