如何将多列产品创建为新列熊猫

时间:2019-02-11 15:30:44

标签: python python-3.x pandas

我有一个pandas数据框:

 import pandas as pd

 df = pd.DataFrame({'dummy_1' : [0, 0, 0, 1, 1, 0],
                    'dummy_2' : [1, 1, 0, 0, 1, 1],
                    'dummy_3' : [1, 1, 1, 0, 0, 0]})

我想将产品,每个列的产品以及其他两个产品添加为新列(在同一数据框中)。

这样得到的数据帧看起来像这样:

df = pd.DataFrame({     'dummy_1' : [0, 0, 0, 1, 1, 0],
                        'dummy_2' : [1, 1, 0, 0, 1, 1],
                        'dummy_3' : [1, 1, 1, 0, 0, 0],
                        'dummy_12' :[0, 0, 0, 0, 1, 0],
                        'dummy_13' :[0, 0, 0, 0, 0, 0],
                        'dummy_23' :[1, 1, 0, 0, 0, 0]})

是否有一种有效的方法?所谓高效,是指一种适用于例如50列

3 个答案:

答案 0 :(得分:3)

使用itertools.combinations获取所有组合并迭代这些组合以计算矢量化乘积并分配给新列

import pandas as pd
from itertools import combinations
df = pd.DataFrame({'dummy_1' : [0, 0, 0, 1, 1, 0],
                'dummy_2' : [1, 1, 0, 0, 1, 1],
                'dummy_3' : [1, 1, 1, 0, 0, 0]})
for i in combinations(df.columns, 2):
    col_name = i[0] + i[1].split('_')[-1]
    df[col_name] = df[i[0]] * df[i[1]]

输出

dummy_1 dummy_2 dummy_3 dummy_12    dummy_13    dummy_23
0       1       1       0           0           1
0       1       1       0           0           1
0       0       1       0           0           0
1       0       0       0           0           0
1       1       0       1           0           0
0       1       0       0           0           0

答案 1 :(得分:2)

您需要:

import pandas as pd

df = pd.DataFrame({'dummy_1' : [0, 0, 0, 1, 1, 0],
                    'dummy_2' : [1, 1, 0, 0, 1, 1],
                    'dummy_3' : [1, 1, 1, 0, 0, 0]})

df['dummy_12'] = df['dummy_1']*df['dummy_2']
df['dummy_13'] = df['dummy_1']*df['dummy_3']
df['dummy_23'] = df['dummy_2']*df['dummy_3']

print(df)

输出:

    dummy_1  dummy_2  dummy_3  dummy_12  dummy_13  dummy_23                                                                                     
0        0        1        1         0         0         1                                                                                     
1        0        1        1         0         0         1                                                                                     
2        0        0        1         0         0         0                                                                                     
3        1        0        0         0         0         0                                                                                     
4        1        1        0         1         0         0                                                                                     
5        0        1        0         0         0         0    

答案 2 :(得分:1)

这应该可以满足您的需求,而无需任何其他导入,只需更改i和j的最大范围即可在较大的数据帧(例如50)上使用它。

for i in range(0, 3):
    for j in range(i + 1, 3):
        df['dummy_%d%d' %(i+1, j+1)] = df.apply(lambda x: x[i] * x[j], axis=1)

输出:

   dummy_1  dummy_2  dummy_3  dummy_12  dummy_13  dummy_23                                                                                     
0        0        1        1         0         0         1                                                                                     
1        0        1        1         0         0         1                                                                                     
2        0        0        1         0         0         0                                                                                     
3        1        0        0         0         0         0                                                                                     
4        1        1        0         1         0         0                                                                                     
5        0        1        0         0         0         0