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
所以我有这两个数据框,我想得到一个新的数据框,它由两个数据框的行的克罗内克积组成。正确的做法是什么?
举个例子: 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。我看到这个问题发布在这里
通过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