python - DataFrame中的累积除法
问题描述
我正在尝试寻找一种方法来为我的数据框实现“累积除法”功能。既然只有 cumsum、cummax 等,没有“cumdiv”,有没有办法手动使一个“累积除法”功能起来?
我看到这个问题划分下一行的值并在数据框中创建列,但它对我不起作用。结果列的所有行的值都为 1。
我应该注意,我链接的问题的公认答案与我想要的结果相似,只是不是底部索引被上部索引划分,而是相反,底部索引被划分由上索引。这将持续到索引结束。
Median ($)
Year
2009 2792
2010 2991
2011 3121
2012 3232
2013 3204
2014 3339
2015 3419
2016 3470
2017 3537
2018 3588
我试图让 2009 年的工资中位数除以随后几年的工资。所以 2009 年的工资除以 2010 年,百分比显示在一个新列中。这在 2011 年重复,依此类推。
希望我能拍出更清晰的画面。
解决方案
所以,第一个猜测,我认为可能是 cumdiv 函数:
df = pd.DataFrame(data={"vals": [10, 3, 2]})
df = df.assign(logged=lambda x: np.log(x.vals))
df.loc[1:,"logged"] *= -1
df["logs_cummulated"] = df.logged.cumsum()
df["cumdiv"] = np.exp(df.logs_cummulated)
df
vals logged logs_cummulated cumdiv
0 10 2.302585 2.302585 10.000000
1 3 -1.098612 1.203973 3.333333
2 2 -0.693147 0.510826 1.666667
请注意,在对数下:log(x/y) = log(x) - log(y)
因此您可以将除法转换为减法(一种加法形式)。在第一行之后将记录的列乘以 -1,因为这些行位于上面显示的对数标识的右侧。然后您可以累积添加转换后的记录列(即使用cumsum
),然后您只需要再次取幂。
顺便说一句,如果你不乘以 -1,你将获得累积乘法。
推荐阅读
- spring-mvc - 当我尝试重定向到任何其他页面时,它会转到 http://localhost:5050/login 而不是 http://localhost:5050/todo/login
- google-colaboratory - 如何通过 Google Colab 文件浏览器查看目录中超过 999 个文件?
- cmake - 如何在不使用 cmake 的 add_library() 的情况下将 lib.a 静态库添加到我的项目中?
- php - How to merge all property values of two objects in PHP
- database - 如何将查询结果插入到 AS400 中的临时表或变量中?
- reactjs - 功能组件中的去抖动
- pytorch - 变换参数作为学习目标
- prometheus - 将 Prometheus 图表从 Prometheus-operator 升级到 kube-Prometheus-stack
- python - 在 python 中使用 selenium 滚动页面,只给我底部元素
- spring - 如何将带有对象的对象发送到服务器Vue.js 3