就地修改多索引pandas数据帧乘以s

2024-06-28 16:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似于

                      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

还有一个有价值观的口述

^{pr2}$

我试着把所有值乘以权重。第一个显而易见的方法是

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,我理解了此警告可能与之相关的原因,但是如何将这些值相乘呢?在


Tags: keyin警告dfforvalueitemsloc
2条回答

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

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

熊猫版本(0.16)没有看到任何警告:

^{pr2}$

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

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

这不是你马上要问的问题,但我会用一种不同的方法来处理这个问题,它应该运行得更快:

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”的列中,因此您可能需要在执行此操作之前重置_index。在

从那里开始,这只是正则乘法。在

^{pr2}$

相关问题 更多 >