这可能听起来有点愚蠢,所以提前道歉。我有这样的数据框:
value date
0 1.0 2010-01-31
1 0.3 2010-02-28
2 1.6 2011-03-31
3 2.5 2011-04-30
4 -1.0 2012-05-31
5 -0.3 2012-06-30
6 1.6 2013-07-31
我希望按年份对其进行分组,并将以下公式应用于每个组 [[(1 + v1)*(1 + v2)*(1 + v3)* ....(1 + vn)] - 1] * 100 因此,操作是为组中的每个单独元素添加1,然后获取其乘积,然后从结果值中减去1,然后将其乘以100
但是当我这样做时
df.groupby(a.date.dt.year).apply(lambda x: (1+x['value'])).prod()
我得到一个单一的价值(我认为它得到了所有产品。我如何获得每个产品的产品(每年一个价值)
答案 0 :(得分:3)
您可以使用groupby
apply
assign
功能之外执行此操作
df.assign(val=df.value+1).groupby(df.date.dt.year).val.prod()-1
Out[800]:
date
2010 1.6
2011 8.1
2012 -1.0
2013 1.6
Name: val, dtype: float64
两个好处:
1,更容易理解
2,效率更高
答案 1 :(得分:1)
df.groupby(a.date.dt.year).apply(lambda x: (1+x['value'])).prod()
此语句将计算相应列中所有值的乘积。因此,无论数据是否已根据年份分组,将仅返回一个值。
但是如果你在lambda函数中应用prod()
函数,如图所示 -
df.groupby(a.date.dt.year).apply(lambda x: (1+x['value']).prod())
这应该根据需要提供输出。