熊猫通过应用不同的权重来创建多个数据框

时间:2018-11-14 09:35:10

标签: python pandas

我有一个包含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

1 个答案:

答案 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]作为系列访问第一个砝码。