pandas - 有条件地使用 Pandas 的累积产品
问题描述
我想累积值(列值)之间的比率的反向乘积。我尝试了此功能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])
结果:
我在找什么:
解决方案
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
。
推荐阅读
- android - 带有 nodejs+expressjs 的 PWA(渐进式 Web 应用程序)在启动时指向 /public/ 文件夹。怎么修?
- ssl - 如何为 java 客户端创建具有特定网站证书的密钥库?
- java - 通过 selenium 在 headless chrome webdriver 下解决 google 的 recaptcha 的方法?爪哇
- ruby-on-rails - Rails 6形成authenticity_token不匹配会话[:_csrf_token]
- javascript - 加载 HTML 文件以在按下按钮时替换 div 内容
- c# - 当我打开我的项目时,我收到以下消息:“此解决方案已脱机。[Team Foundation //https://xxxxxxxxxxxx/tfs/applications”
- google-apps-script - 修改代码 - 查找单元格中数据的第二个最后一个字母。Google Apps 脚本/Google 表格
- python - 加快数据帧编码循环
- pascal - 刚刚安装了 Lazarus,当我运行项目时我的 hello world 没有显示(ubuntu)
- google-apps-script - 有没有办法使用 Google App Script 在幻灯片幻灯片中的缩略图之间导航?