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

如何为Pandas DataFrame添加所有列两两相乘的新特征

在Pandas中添加两两特征乘积的新特征

这里有几种实用的方法可以实现需求,保留原特征的同时添加所有两两特征的乘积项:

方法一:手动生成(适合特征数量少的场景)

如果你的特征不多,像例子里只有4个,可以直接手动计算每个乘积列并添加到DataFrame:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'X_1': [1, 2, 3],
    'X_2': [4, 5, 6],
    'X_3': [7, 8, 9],
    'X_4': [10, 11, 12]
})

# 逐个添加两两乘积特征
df['X_1*X_2'] = df['X_1'] * df['X_2']
df['X_1*X_3'] = df['X_1'] * df['X_3']
df['X_1*X_4'] = df['X_1'] * df['X_4']
df['X_2*X_3'] = df['X_2'] * df['X_3']
df['X_2*X_4'] = df['X_2'] * df['X_4']
df['X_3*X_4'] = df['X_3'] * df['X_4']

方法二:自动遍历特征组合(适合特征数量多的场景)

当特征数量较多时,用itertools.combinations自动生成所有两两特征对,避免重复手动编码:

import pandas as pd
from itertools import combinations

# 示例DataFrame
df = pd.DataFrame({
    'X_1': [1, 2, 3],
    'X_2': [4, 5, 6],
    'X_3': [7, 8, 9],
    'X_4': [10, 11, 12]
})

# 获取所有两两不重复的特征组合
feature_pairs = combinations(df.columns, 2)

# 遍历组合,添加乘积特征
for col1, col2 in feature_pairs:
    new_col_name = f"{col1}*{col2}"
    df[new_col_name] = df[col1] * df[col2]

方法三:用Scikit-learn的PolynomialFeatures(适合机器学习预处理流程)

如果你正在做机器学习建模,可以用PolynomialFeatures生成交互项,设置interaction_only=True只会生成两两乘积,不会包含平方项:

import pandas as pd
from sklearn.preprocessing import PolynomialFeatures

# 示例DataFrame
df = pd.DataFrame({
    'X_1': [1, 2, 3],
    'X_2': [4, 5, 6],
    'X_3': [7, 8, 9],
    'X_4': [10, 11, 12]
})

# 初始化转换器,只生成交互项、不包含偏置项
poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)
# 转换特征,得到包含原特征和乘积特征的数组
poly_data = poly.fit_transform(df)
# 获取转换后的特征名
new_feature_names = poly.get_feature_names_out(df.columns)
# 转换为DataFrame,自动包含原特征和所有乘积项
df_with_interactions = pd.DataFrame(poly_data, columns=new_feature_names, index=df.index)

三种方法都能保留原特征,你可以根据实际场景选择:

  • 特征少选手动法,直观简单;
  • 特征多选自动遍历法,高效不重复;
  • 做机器学习选Scikit-learn法,能和其他预处理步骤无缝衔接。

内容的提问来源于stack exchange,提问作者Kev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:40:23