6

我有一个带有 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 等于提供的限制时(即 500 % 500 的 cumsum[ms] 等于零),我才成功地重置为零。

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

4

1 回答 1

11

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

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列表放入数据框中:

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
于 2014-11-25T17:48:20.067 回答