'kronecker product pandas dataframes

I have two dataframes

    A  B
0   1  2
1   1  2
2   1  2

and

    C  D
0   1  4
1   2  5
2   3  6

I need the mean of the cross products (AC, AD, BC, BD). As such I was hoping to be able to compute

    AC  AD BC BD 
0   1   4  2   8
1   2   5  4  10
2   3   6  6  12

but so far I have been unable to do so. I tried multiply etc, but to no avail. I can do it using loops obviously, but is there an elegant way to do it?

Cheers, Mike



Solution 1:[1]

consider the dataframes d1 and d2

d1 = pd.DataFrame([[1, 2]] * 3, columns=list('AB'))
d2 = pd.DataFrame(np.arange(1, 7).reshape(2, 3).T, columns=list('CD'))

Then the kronecker product is

kp = pd.DataFrame(np.kron(d1, d2), columns=pd.MultiIndex.from_product([d1, d2]))
kp

enter image description here


NOTE
This is equivalent to flattening the outer products of each pair of columns. Not the cross products.

Solution 2:[2]

for python 3.7, given dataframes data1 and data2

def kronecker(data1:'Dataframe 1',data2:'Dataframe 2'):
Combination = pd.DataFrame(); d1 = pd.DataFrame()
for i in data2.columns:
    d1 = data1.multiply(data2[i] , axis="index")
    d1.columns = [f'{i}{j}' for j in data1.columns]
    Combination = pd.concat([Combination, d1], axis = 1)
return Combination

Solution 3:[3]

To complement the answer of @piRSquared, if you want a partial Kronecker product like described in the question (along a single axis):

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)
            )

output:

   AC  AD  BC  BD
0   1   4   2   8
1   2   5   4  10
2   3   6   6  12

In contrast, the other answer would give:

   AC  AD  BC  BD
0   1   4   2   8
1   2   5   4  10
2   3   6   6  12
3   1   4   2   8
4   2   5   4  10
5   3   6   6  12
6   1   4   2   8
7   2   5   4  10
8   3   6   6  12

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 piRSquared
Solution 2 gaaa
Solution 3 mozway