pandas 数据框行的克罗内克积

Kronecker product over the rows of a pandas dataframe

所以我有这两个数据框,我想得到一个新的数据框,它由两个数据框的行的克罗内克积组成。正确的做法是什么?

举个例子: DataFrame1

   c1   c2
0  10  100
1  11  110
2  12  120

和 DataFrame2

   a1   a2
0  5    7
1  1   10
2  2   4

那么我想要下面的矩阵:

   c1a1   c1a2   c2a1   c2a2
0  50     70     500    700
1  11     110    110    1100
2  24     48     240    480

我希望我的问题很清楚。

PS。我看到这个问题发布在这里 。但是,给出的答案不是正确的答案(我相信我的和原来的问题,但绝对不是我的)。那里的答案给出了两个数据框的 Kronecker 产品,但我只想要它在行上。

通过MultiIndex.from_product, convert both columns to MultiIndex by DataFrame.reindex和多个Dataframe创建MultiIndex,最后展平MultiIndex

c = pd.MultiIndex.from_product([df1, df2])
df = df1.reindex(c, axis=1, level=0).mul(df2.reindex(c, axis=1, level=1))
df.columns = df.columns.map(lambda x: f'{x[0]}{x[1]}')
print (df)
   c1a1  c1a2  c2a1  c2a2
0    50    70   500   700
1    11   110   110  1100
2    24    48   240   480

使用numpy提高效率:

import numpy as np
pd.DataFrame(np.einsum('nk,nl->nkl', df1, df2).reshape(df1.shape[0], -1),
             columns=pd.MultiIndex.from_product([df1, df2]).map(''.join)
            )

输出:

   c1a1  c1a2  c2a1  c2a2
0    50    70   500   700
1    11   110   110  1100
2    24    48   240   480