baqm
baqm

Reputation: 131

How to multiply every column in one dataframe with all columns in other dataframe

I have two dataframes X_dummy and X_var, where X_dummy contains dummies and looks like this:

dummy1 dummy2 
 1       0     
 0       1      
 1       0      

The X_var dataframe looks contains variables and looks like this:

var1 var2 
 4    2    
 10   5    
 1    1    

Now I want to create a dataframe containing the cellwise product of every column from X_dummy with the complete X_var dataframe. Hence, my resulting dataframe should look like, X_result:

var1dummy1  var2dummy1  var1dummy2  var2dummy2  

    4           2           0          0                  
    0           0           10         5                     
    1           1           0          0                  
    

Does anyone know how to do this without using multiple for loops?

Upvotes: 2

Views: 166

Answers (3)

DYZ
DYZ

Reputation: 57033

You can definitely do it with one loop:

dummies = X_dummy.astype(bool)
pd.concat([X_var.loc[dummies[c]] for c in dummies], axis=1).fillna(0).astype(int)
#   var1  var2  var1  var2
#0     4     2     0     0
#1     0     0    10     5
#2     1     1     0     0

Note that because one of your dataframes contains dummies, you do not need multiplication at all.

Upvotes: 1

BENY
BENY

Reputation: 323226

Something like numpy broadcast

new = pd.DataFrame(np.concatenate(df2.T.values * df1.T.values[:,None]).T)
new
Out[161]: 
   0  1   2  3
0  4  2   0  0
1  0  0  10  5
2  1  1   0  0
##new.columns = pd.MultiIndex.from_product([df1.columns,df2.columns]).map('_'.join)

Upvotes: 4

Scott Boston
Scott Boston

Reputation: 153460

Try:

pd.concat([(df1[i]*df2[j]).rename(f'{i}{j}') for i in df1 for j in df2], axis=1)

Output:

   dummy1var1  dummy1var2  dummy2var1  dummy2var2
0           4           2           0           0
1           0           0          10           5
2           1           1           0           0

Upvotes: 3

Related Questions