如何用Pandas生成多元回归中交互项的全列积数据表
生成两个DataFrame列的全两两乘积交互项
问题场景
在多元线性回归中,需要构建两个DataFrame中所有列的两两元素乘积交互项——即df1的每一列与df2的每一列对应位置元素相乘,生成包含所有组合的新DataFrame。
示例数据
import pandas as pd # 示例输入DataFrame1 df1 = pd.DataFrame({ 'A': [1, 2, 3], 'B': [4, 5, 6] }) # 示例输入DataFrame2 df2 = pd.DataFrame({ 'X': [7, 8, 9], 'Y': [10, 11, 12] })
期望输出
A_x_X A_x_Y B_x_X B_x_Y 0 7 10 28 40 1 16 22 40 55 2 27 36 54 72
常见错误分析
- 使用
df1@df2报错:矩阵乘法要求左操作数的列数等于右操作数的行数,这里df1是3行2列,df2是3行2列,维度不匹配,因此触发对齐错误。 - 使用
df1.T@df2得到非期望结果:该操作计算的是矩阵点积,输出为2行2列的聚合结果,并非逐元素的列组合乘积。
解决方法
方法1:列表推导式(简洁高效)
通过双重循环遍历两个DataFrame的列,逐列计算元素乘积,直接生成目标DataFrame:
interactions = pd.DataFrame({ f"{col1}_x_{col2}": df1[col1] * df2[col2] for col1 in df1.columns for col2 in df2.columns })
方法2:Numpy广播机制(适合大规模数据)
利用Numpy的广播特性,扩展维度后逐元素相乘,再重塑为DataFrame:
import numpy as np # 扩展维度实现广播 arr1 = df1.to_numpy()[:, :, np.newaxis] # 形状 (行数, df1列数, 1) arr2 = df2.to_numpy()[:, np.newaxis, :] # 形状 (行数, 1, df2列数) # 计算乘积并重塑为二维数组 interact_arr = (arr1 * arr2).reshape(df1.shape[0], -1) # 转为DataFrame并设置列名 interactions = pd.DataFrame( interact_arr, columns=[f"{c1}_x_{c2}" for c1 in df1.columns for c2 in df2.columns] )
方法3:长格式转宽格式(逻辑直观)
通过将DataFrame转为长格式,合并后计算乘积,再转回宽格式:
# 转长格式 df1_long = df1.stack().reset_index(name='val1') df2_long = df2.stack().reset_index(name='val2') # 合并并计算乘积 merged = df1_long.merge(df2_long, on='level_0') merged['product'] = merged['val1'] * merged['val2'] merged['col_name'] = merged['level_1_x'] + '_x_' + merged['level_1_y'] # 转回宽格式 interactions = merged.pivot( index='level_0', columns='col_name', values='product' ).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者turbonate
相关产品推荐
相关产品推荐

