修改多标志pandas数据框到位乘以标量

时间:2015-05-05 16:19:51

标签: python pandas

我有一个类似于

的多索引数据框
                      value       identifier

EA    2007-01-01      0.33            55
      2007-01-01      0.73            56
      2007-01-01      0.51            57
      2007-02-01      0.13            55
      2007-02-01      0.23            57
      2007-03-01      0.82            55
      2007-03-01      0.88            56
      2007-03-01      0.19            57
      2008-01-01      0.36            55
      2008-01-01      0.26            57
      2008-02-01      0.17            55
      2008-02-01      0.17            56
      2008-02-01      0.57            57
      2008-03-01      0.75            55
      2008-03-01      0.45            56
EB    2007-01-01      0.13            55
      2007-01-01      0.74            56
      2007-01-01      0.56            57
      2007-02-01      0.93            55
      2007-02-01      0.23            57
      2007-03-01      0.82            55
      2007-03-01      0.38            56
      2007-03-01      0.19            57
      2008-01-01      0.46            55
      2008-01-01      0.26            57
      2008-02-01      0.67            55
      2008-02-01      0.98            56
      2008-02-01      0.11            57
      2008-03-01      0.75            55
      2008-03-01      0.22            56

和带有值

的字典
weights = {"EA":0.1, "EB":0.7}

我试图将所有值乘以权重。第一个明显的方法是

for key, weight in weigths.items():
    df[key]['value'] = df[key]['value'] * weight

但这给了一个警告:

 SettingWithCopyWarning: 
 A value is trying to be set on a copy of a slice from a DataFrame.
 Try using .loc[row_indexer,col_indexer] = value instead

所以我尝试了这个:

for key, weight in weigths.items():
    df.loc[key,'value'] = df.loc[key,'value'] * weight

但是它无法找到专栏value。这种形式有效,但它给出了相同的警告:

for key, weight in weigths.items():
    df.loc[key]['value'] = df.loc[key]['value'] * weight

基于documentation,我理解为什么这个警告可能是相关的,但是我怎样才能将这些值相乘?

2 个答案:

答案 0 :(得分:1)

这不是你的直接问题,但我对这个问题采取了不同的方法,应该更快地运行:

df['wt'] = df['index'].map(weights)

df

   index        date  value  identifier   wt
0     EA  2007-01-01   0.33          55  0.1
1     EA  2007-01-01   0.73          56  0.1
2     EA  2007-01-01   0.51          57  0.1

...

15    EB  2007-01-01   0.13          55  0.7
16    EB  2007-01-01   0.74          56  0.7
17    EB  2007-01-01   0.56          57  0.7

我假设EA / EB位于名为' index'的列中,因此您可能需要在执行此操作之前重置reset_index。

从那里开始,它只是常规的乘法。

df[['value','identifier']].mul(df['wt'],axis=0)

答案 1 :(得分:0)

要摆脱不言自明的警告,请执行以下操作:

df['value'][key] = df['value'][key] * 1000000

不要看到任何带有pandas版本的警告(0.16):

In [891]: df
Out[891]: 
               value  identifier
ind1 ind2                       
EA   01/01/07   0.33          55
     01/01/07   0.73          56
     01/01/07   0.51          57
     01/02/07   0.13          55
     01/02/07   0.23          57
     01/03/07   0.82          55
     01/03/07   0.88          56
     01/03/07   0.19          57
     01/01/08   0.36          55
     01/01/08   0.26          57
     01/02/08   0.17          55
     01/02/08   0.17          56
     01/02/08   0.57          57
     01/03/08   0.75          55
     01/03/08   0.45          56
EB   01/01/07   0.13          55
     01/01/07   0.74          56
     01/01/07   0.56          57
     01/02/07   0.93          55
     01/02/07   0.23          57
     01/03/07   0.82          55
     01/03/07   0.38          56
     01/03/07   0.19          57
     01/01/08   0.46          55
     01/01/08   0.26          57
     01/02/08   0.67          55

In [892]: df.loc['EA']['value'] = df.loc['EA']['value'] * weights[k]

In [893]: df
Out[893]: 
               value  identifier
ind1 ind2                       
EA   01/01/07  0.231          55
     01/01/07  0.511          56
     01/01/07  0.357          57
     01/02/07  0.091          55
     01/02/07  0.161          57
     01/03/07  0.574          55
     01/03/07  0.616          56
     01/03/07  0.133          57
     01/01/08  0.252          55
     01/01/08  0.182          57
     01/02/08  0.119          55
     01/02/08  0.119          56
     01/02/08  0.399          57
     01/03/08  0.525          55
     01/03/08  0.315          56
EB   01/01/07  0.130          55
     01/01/07  0.740          56
     01/01/07  0.560          57
     01/02/07  0.930          55
     01/02/07  0.230          57
     01/03/07  0.820          55
     01/03/07  0.380          56
     01/03/07  0.190          57
     01/01/08  0.460          55
     01/01/08  0.260          57
     01/02/08  0.670          55

此外,您可以将数据帧与标量值相乘,如下所示:

In [894]: df.multiply(500, level=1)
Out[894]: 
               value  identifier
ind1 ind2                       
EA   01/01/07  115.5       27500
     01/01/07  255.5       28000
     01/01/07  178.5       28500
     01/02/07   45.5       27500
     01/02/07   80.5       28500
     01/03/07  287.0       27500
     01/03/07  308.0       28000
     01/03/07   66.5       28500
     01/01/08  126.0       27500
     01/01/08   91.0       28500
     01/02/08   59.5       27500
     01/02/08   59.5       28000
     01/02/08  199.5       28500
     01/03/08  262.5       27500
     01/03/08  157.5       28000
EB   01/01/07   65.0       27500
     01/01/07  370.0       28000
     01/01/07  280.0       28500
     01/02/07  465.0       27500
     01/02/07  115.0       28500
     01/03/07  410.0       27500
     01/03/07  190.0       28000
     01/03/07   95.0       28500
     01/01/08  230.0       27500
     01/01/08  130.0       28500
     01/02/08  335.0       27500