我想累计两个值(列值)之间比率的向后乘积。我尝试了此功能df.groupby('id')['rate'].transform(lambda x: x[::-1].cumprod()[::-1])
,但会累加所有费率。
我的数据框:
data = {
'id': [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100],
'year': [2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018],
'value': [0, 11927, 0, 10355, 0, 0, 0, 0, 0, 0, 12020],
'rate': [0.998, 0.989, 0.998, 1.019, 1.011, 1.011, 0.984, 0.988, 0.988, 1.006, np.nan]
}
df = pd.DataFrame(data)
df.loc[df.value==0, 'rate_product_cumul'] = df.groupby(['id']).rate\
.transform(lambda x: x[::-1].cumprod()[::-1])
结果:
我要寻找的东西
答案 0 :(得分:1)
IIUC,尝试:
df['rate_product_cumul'] = df.groupby(['id', df['value'].diff().ne(0).cumsum()])['rate']\
.apply(lambda x: x[::-1].cumprod()[::-1])
输出:
id year value rate rate_product_cumul
0 100 2008 0 0.998 0.998000
1 100 2009 11927 0.989 0.989000
2 100 2010 0 0.998 0.998000
3 100 2011 10355 1.019 1.019000
4 100 2012 0 1.011 0.987664
5 100 2013 0 1.011 0.976918
6 100 2014 0 0.984 0.966289
7 100 2015 0 0.988 0.982001
8 100 2016 0 0.988 0.993928
9 100 2017 0 1.006 1.006000
10 100 2018 12020 NaN NaN
您需要使用diff
,ne
和cumsum
为每次“值”更改创建一个临时组密钥。