将选定的交互作为列添加到 pandas 数据框

Add selected interactions as columns to pandas dataframe

我是 pandas 和 python 的新手。我正在尝试 return 一些选定的数据框中所有可能交互的交互项,然后 return 它们作为 df 中的新功能。

我的解决方案是使用 sklearn 的 PolynomialFeature() 计算感兴趣的交互并将它们附加到 for 循环中的 df。参见示例:

import numpy as np
import pandas as pd
from sklearn.preprocessing import PolynomialFeatures

np.random.seed(1111)
a1 = np.random.randint(2, size = (5,3))
a2 = np.round(np.random.random((5,3)),2)

df = pd.DataFrame(np.concatenate([a1, a2], axis = 1), columns = ['a','b','c','d','e','f'])

combinations = [['a', 'e'], ['a', 'f'], ['b', 'f']]

for comb in combinations:
    polynomizer = PolynomialFeatures(interaction_only=True, include_bias=False).fit(df[comb])

    newcol_nam = polynomizer.get_feature_names(comb)[2]
    newcol_val = polynomizer.transform(df[comb])[:,2]

    df[newcol_nam] = newcol_val

df
    a       b       c       d       e       f       a e     a f     b f
0   0.0     1.0     1.0     0.51    0.45    0.10    0.00    0.00    0.10
1   1.0     0.0     0.0     0.67    0.36    0.23    0.36    0.23    0.00
2   0.0     0.0     0.0     0.97    0.79    0.02    0.00    0.00    0.00
3   0.0     1.0     0.0     0.44    0.37    0.52    0.00    0.00    0.52
4   0.0     0.0     0.0     0.16    0.02    0.94    0.00    0.00    0.00

另一个解决方案是 运行

PolynomialFeatures(2, interaction_only=True, include_bias=False).fit_transform(df)

然后放弃我不感兴趣的互动。 但是,就性能而言,这两个选项都不是理想的选择,我想知道是否有更好的解决方案。

如评论所述,您可以试试:

df = df.join(pd.DataFrame({
    f'{x} {y}': df[x]*df[y] for x,y in combinations
}))

或者简单地说:

for comb in combinations:
    df[' '.join(comb)] = df[comb].prod(1)

输出:

     a    b    c     d     e     f   a e   a f   b f
0  0.0  1.0  1.0  0.51  0.45  0.10  0.00  0.00  0.10
1  1.0  0.0  0.0  0.67  0.36  0.23  0.36  0.23  0.00
2  0.0  0.0  0.0  0.97  0.79  0.02  0.00  0.00  0.00
3  0.0  1.0  0.0  0.44  0.37  0.52  0.00  0.00  0.52
4  0.0  0.0  0.0  0.16  0.02  0.94  0.00  0.00  0.00