【问题标题】:Cumulative or Rolling Product in a Dataframe数据框中的累积或滚动乘积
【发布时间】:2018-12-29 02:24:49
【问题描述】:

您好,我有一个包含一列的数据框,我只想添加另一列,该列采用原始列的滚动乘积。我已经在谷歌上搜索了一段时间,但这似乎是一个基本的功能——不确定我是否遗漏了一些东西。我喜欢将 B 列作为输出。

A   B
1   1
2   2
3   6
4   24
5   120
6   720
7   5040

如果它存在的话,我基本上是在寻找这样的东西:

数据['B'] = 数据['A'].rolling(window=1).product()

我从之前找到了这篇文章,但它似乎正在使用不再活跃的 rolling_apply?:

How to calculate rolling cumulative product on Pandas DataFrame

我在这里尝试过使用类似的解决方案,但它似乎不起作用。

dftest= pd.DataFrame([1,2,3,4,5,6,7],columns=['A'])
dftest['cum']=dftest['A'].rolling(1).apply(lambda x:x.prod())

输出:

   A  cumprod
0  1  1.0
1  2  2.0
2  3  3.0
3  4  4.0
4  5  5.0
5  6  6.0
6  7  7.0

【问题讨论】:

  • 我已经浏览了以前的帖子。我唯一能找到有效的方法是 5 年前问过并使用 rolling_apply 似乎不再是一个选项
  • 您说的是“滚动产品”,但在我看来,这更像是一种扩展产品。窗口为 1 的滚动产品只是系列本身,不是吗?
  • 骗子的答案已经有一段时间没有出现在 pandas 中了,虽然这可能仍然是骗子,但必须有更好的目标
  • @DSM 你说得对——我需要一个扩展产品。

标签: python python-3.x pandas dataframe


【解决方案1】:

好像你想要cumprod

df = pd.DataFrame({'v':[1,2,3,4,5,6]})
df['prod'] = df.v.cumprod()

    v   prod
0   1   1
1   2   2
2   3   6
3   4   24
4   5   120
5   6   720

也可以

df.v.expanding().agg(lambda a:a.prod())

0      1.0
1      2.0
2      6.0
3     24.0
4    120.0
5    720.0

【讨论】:

  • 太完美了! +1 不错的答案。尤其是扩展。
猜你喜欢
  • 2019-07-01
  • 1970-01-01
  • 2013-02-24
  • 2020-08-07
  • 1970-01-01
  • 2020-11-12
  • 2021-11-10
  • 2017-03-07
  • 1970-01-01
相关资源
最近更新 更多