有条件使用熊猫的累计产品

时间:2019-07-12 17:20:17

标签: pandas dataframe pandas-groupby

我想累计两个值(列值)之间比率的向后乘积。我尝试了此功能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) 

enter image description here

df.loc[df.value==0, 'rate_product_cumul'] = df.groupby(['id']).rate\
                                              .transform(lambda x: x[::-1].cumprod()[::-1])

结果:

enter image description here

我要寻找的东西

enter image description here

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

您需要使用diffnecumsum为每次“值”更改创建一个临时组密钥。