我有一个包含3列的数据框,我想将它们加在一起并测试不同的权重。
到目前为止,我已经编写了这段代码,但是我认为这可能不是最好的方法:
weights = [0.5,0.6,0.7,0.8,0.9,1.0]
for i in weights:
for j in weights:
for k in weights:
outname='outname'+str(i)+'TV'+str(j)+'BB'+str(k)+'TP'
df_media[['outname']]=df_media[['TP']].multiply(i)
+df_media[['TV']].multiply(j)
+df_media[['BB']].multiply(k)
下面是输入数据帧和循环的第一个输出迭代。因此,所有列均已乘以0.5。
df_media:
TV BB TP
1 2 6
11 4 5
4 4 3
输出数据框:
'Outname0.5TV0.5BB0.5TP'
4.5
10
5.5
答案 0 :(得分:0)
如果每个循环都需要一个数据框,则可以使用字典。使用此解决方案,您也不需要将因子存储在列名称中,因为权重可以作为关键。这是通过字典理解的一种方法:
weights = [0.5,0.6,0.7,0.8,0.9,1.0]
col_name = '-'.join(df_media.columns)
dfs = {w: (df_media.sum(1) * w).to_frame(col_name) for w in weights}
print(dfs[0.5])
TV-BB-TP
0 4.5
1 10.0
2 5.5
更有效的方法是将结果存储在单个数据框中。这消除了对Python级循环的需要。
res = pd.DataFrame(df.sum(1).values[:, None] * np.array(weights),
columns=weights)
print(res)
0.5 0.6 0.7 0.8 0.9 1.0
0 4.5 5.4 6.3 7.2 8.1 9.0
1 10.0 12.0 14.0 16.0 18.0 20.0
2 5.5 6.6 7.7 8.8 9.9 11.0
然后,例如,通过res[0.5]
作为系列访问第一个砝码。