我想用熊猫数据框计算投资组合权重。以下是一些虚拟数据示例:
df1 = DataFrame({'name' : ['ann','bob']*3}).sort('name').reset_index(drop=True)
df2 = DataFrame({'stock' : list('ABC')*2})
df3 = DataFrame({'val': np.random.randint(10,100,6)})
df = pd.concat([df1, df2, df3], axis=1)
每个人拥有3只股票,价值为val
。我们可以像这样计算投资组合权重:
df.groupby('name').apply(lambda x: x.val/(x.val).sum())
给出了这个:
如果我想将wgt
列添加到df
,我需要将此结果合并回df
和name
上的index
。这看起来相当笨重。
有没有办法一步到位?或者,最好地利用熊猫特征的方法是什么?
答案 0 :(得分:3)
使用transform
,这将返回一个索引与原始df对齐的系列:
In [114]:
df['wgt'] = df.groupby('name')['val'].transform(lambda x: x/x.sum())
df
Out[114]:
name stock val wgt
0 ann A 18 0.131387
1 ann B 43 0.313869
2 ann C 76 0.554745
3 bob A 16 0.142857
4 bob B 44 0.392857
5 bob C 52 0.464286