我有一个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列
答案 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