1_2 1_3 1_4 2_3 2_4 3_4
1 5 2 8 2 2
4 3 4 5 8 5
8 8 8 9 3 3
4 3 4 4 8 3
8 0 7 4 2 2
列是1,2,3,4的4C2组合。我想生成4个新列f_1, f_2, f_3, f_4
,其中列的值定义为be
df['f_1'] = df['1_2']+df['1_3']+df['1_4']
df['f_2'] = df['1_2']+df['2_3']+df['2_4']
df['f_3'] = df['1_3']+df['2_3']+df['3_4']
df['f_4'] = df['1_4']+df['2_4']+df['3_4']
其他单词,列定义为列的总和。
因此,在这种情况下,我可以强迫自己的方式。但是,我的原始数据框架要大得多,而有
f_i
列,因此蛮力的方法是行不通的。
因此,期望的结果看起来像
i_j
谢谢你。
构建列的词典并以循环处理:
k_i
20C2 = 190
而不是循环:
1_2 1_3 1_4 2_3 2_4 3_4 f_1 f_2 f_3 f_4
1 5 2 8 2 2 8 11 15 6
4 3 4 5 8 5 11 17 13 17
8 8 8 9 3 3 24 20 20 14
4 3 4 4 8 3 11 16 10 15
8 0 7 4 2 2 15 14 6 11
s = df.columns.to_series().str.split('_').explode()
d = s.index.groupby(s)
for k, v in d.items():
df[f'f_{k}'] = df[v].sum(axis=1)
中间体eval
:
query = '\n'.join(f'f_{k} = {"+".join(map("`{}`".format, v))}'
for k,v in d.items())
out = df.eval(query)