我有一个类似于
的多索引数据框 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,我理解为什么这个警告可能是相关的,但是我怎样才能将这些值相乘?
答案 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