You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:52:37