【问题标题】:Python pandas cumsum() reset after hitting maxPython pandas cumsum() 在达到最大值后重置
【发布时间】:2015-01-23 19:31:09
【问题描述】:

我有一个带有 timedeltas 的 pandas DataFrame,它是单独列中这些增量的累积总和,以毫秒为单位。下面提供了一个示例:

Transaction_ID  Time            TimeDelta       CumSum[ms]
1              00:00:04.500     00:00:00.000    000
2              00:00:04.600     00:00:00.100    100
3              00:00:04.762     00:00:00.162    262
4              00:00:05.543     00:00:00.781    1043
5              00:00:09.567     00:00:04.024    5067
6              00:00:10.654     00:00:01.087    6154
7              00:00:14.300     00:00:03.646    9800
8              00:00:14.532     00:00:00.232    10032
9              00:00:16.500     00:00:01.968    12000
10             00:00:17.543     00:00:01.043    13043

我希望能够为 CumSum[ms] 提供一个最大值,之后累积和将从 0 重新开始。例如,如果在上面的示例中最大值为 3000,结果将如下所示所以:

Transaction_ID  Time            TimeDelta       CumSum[ms]
1              00:00:04.500     00:00:00.000    000
2              00:00:04.600     00:00:00.100    100
3              00:00:04.762     00:00:00.162    262
4              00:00:05.543     00:00:00.781    1043
5              00:00:09.567     00:00:04.024    0
6              00:00:10.654     00:00:01.087    1087
7              00:00:14.300     00:00:03.646    0
8              00:00:14.532     00:00:00.232    232
9              00:00:16.500     00:00:01.968    2200
10             00:00:17.543     00:00:01.043    0

我已经探索过使用模运算符,但只有当结果 cumsum 等于提供的限制(即 cumsum[ms] of 500 % 500 等于零)时,我才成功地重置为零。

提前感谢您的任何想法,如果我可以提供更多信息,请告诉我。

【问题讨论】:

标签: python pandas timedelta cumsum


【解决方案1】:

下面是一个示例,说明如何通过迭代数据框中的每一行来做到这一点。为简单起见,我为示例创建了新数据:

df = pd.DataFrame({'TimeDelta': np.random.normal( 900, 60, size=100)})
print df.head()
    TimeDelta
0  971.021295
1  734.359861
2  867.000397
3  992.166539
4  853.281131

所以让我们用你想要的最大 3000 做一个累加器循环:

maxvalue = 3000

lastvalue = 0
newcum = []
for row in df.iterrows():
    thisvalue =  row[1]['TimeDelta'] + lastvalue
    if thisvalue > maxvalue:
        thisvalue = 0
    newcum.append( thisvalue )
    lastvalue = thisvalue

然后将newcom列表放入dataframe:

df['newcum'] = newcum
print df.head()
    TimeDelta       newcum
0  801.977678   801.977678
1  893.296429  1695.274107
2  935.303566  2630.577673
3  850.719497     0.000000
4  951.554206   951.554206

【讨论】:

  • 这非常有效。看起来我对cumsum() 过于复杂了。非常感谢您的参与。
  • Pandas 支持的 numpy 累加器的优势在于它们的速度非常快。我想,迭代是在 C 中完成的。在 Pandas 中迭代行总是慢得多。但有时这是一件相当务实的事情。
  • 谢谢。如果我有另一种情况 > 在 ID 更改时达到 max+reset 后重置...我该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多