【问题标题】:Creating interaction terms in python在 python 中创建交互项
【发布时间】:2021-08-23 19:20:55
【问题描述】:

我正在尝试在数据集中创建交互项。是否有另一种(更简单)的方法来创建数据集中列的交互项?例如,在列 4:98 和 98:106 的组合中创建交互项。我尝试使用 numpy 数组遍历列,但使用以下代码,内核不断死亡。

col1 = df.columns[4:98] #94 columns 
col2 = df.columns[98:106] #8 columns
var1_np = df_np[:, 4:98]
var2_np = df_np[:, 98:106]
for i in range(94):
    for j in range(8):
        name = col1[i] +"*" + col2[j]
        df[name] = var1_np[:,i]*var2_np[:,j]

这里,df 是数据帧,df_np 是 NumPy 数组中的 df。

【问题讨论】:

  • 在执行这段代码的过程中你检查过你机器上的内存使用吗?我们不知道您的数据框中有多少行,但考虑到您正在创建的新列的数量,内存可能是一个问题。您可能想尝试在较少的列上测试您的代码。您也可以尝试使用交互项创建一个 numpy 数组,然后将整个数组一次转换为一个新的数据帧,因为这将是一个成本较低的操作。
  • 另外,scikit-learn 的PolynomialFeatures 经常被用来生成交互词。

标签: python pandas numpy kernel interaction


【解决方案1】:

您可以使用itertools.product,它大致相当于生成器表达式中的嵌套 for 循环。然后,使用join 创建具有product 结果的新列名。之后,使用 Pandas prod 返回轴一(沿列)上两列的乘积。

import pandas as pd
import numpy as np
from itertools import product

#setup
np.random.seed(12345)
data = np.random.rand(5, 10).round(2)
df = pd.DataFrame(data)
df.columns = [f'col_{c}' for c in range(0,10)]
print(df)

#code
col1 = df.columns[3:5]
col2 = df.columns[5:8]

df_new = pd.DataFrame()
for i in product(col1, col2):
    name = "*".join(i)
    df_new[name] = df[list(i)].prod(axis=1)

print(df_new)

df的输出

   col_0  col_1  col_2  col_3  col_4  col_5  col_6  col_7  col_8  col_9
0   0.93   0.32   0.18   0.20   0.57   0.60   0.96   0.65   0.75   0.65
1   0.75   0.96   0.01   0.11   0.30   0.66   0.81   0.87   0.96   0.72
2   0.64   0.72   0.47   0.33   0.44   0.73   0.99   0.68   0.79   0.17
3   0.03   0.80   0.90   0.02   0.49   0.53   0.60   0.05   0.90   0.73
4   0.82   0.50   0.81   0.10   0.22   0.26   0.47   0.46   0.71   0.18

df_new的输出

   col_3*col_5  col_3*col_6  col_3*col_7  col_4*col_5  col_4*col_6  col_4*col_7
0       0.1200       0.1920       0.1300       0.3420       0.5472       0.3705
1       0.0726       0.0891       0.0957       0.1980       0.2430       0.2610
2       0.2409       0.3267       0.2244       0.3212       0.4356       0.2992
3       0.0106       0.0120       0.0010       0.2597       0.2940       0.0245
4       0.0260       0.0470       0.0460       0.0572       0.1034       0.1012

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多