首页 > 解决方案 > 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 年重复,依此类推。

希望我能拍出更清晰的画面。

标签: pythonpandasdataframe

解决方案


所以,第一个猜测,我认为可能是 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,你将获得累积乘法。


推荐阅读