当前位置: 首页 > 面试题库 >

达到最大值后重置Python Pandas cumsum()

张玺
2023-03-14
问题内容

我有一个带有timedeltas的pandas DataFrame,作为在单独的列中以毫秒表示的这些delta的累积和。下面提供了一个示例:

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

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

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


问题答案:

这是一个如何遍历数据帧中每一行的示例。为了简单起见,我为该示例创建了新数据:

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


 类似资料:
  • 问题内容: 如何求和下一行的总和,直到达到阈值点,然后再次重置计数器。 例如,如果阈值是10,我试图获得以下输出: 但是我只能通过以下查询获得累计距离: 我正在使用PostgreSQL。 问题答案: 使用用户定义的聚合 实时测试:http://sqlfiddle.com/#!17/16716/2 用户定义的合计sum_with_reset定义: 数据 输出: 单线: Postgres布尔值可以使用

  • 我在用R做一些建模算法,其中一个是用Java运行的(bartMachine)。我发现,由于数据的大小,我需要在运行建模算法之前增加java的最大堆空间。 我是这样做的: 我的问题是,如果没有其他算法使用java(或者至少有那么多堆空间),我是否需要在以后重置堆空间?或者,分配给java的内存会根据需要回收,而不会造成性能损失? 我已经搜索了一些关于这个主题的内容,并且我了解如何更改/降低堆空间。我

  • 我有输入数组A 我想要函数Max(T, A)返回B表示A上的最大值在大小T的前一个移动窗口中 通过使用最大堆跟踪当前移动窗口A[i]到A[it]上的最大值,该算法产生O(N log(T))最坏情况。 我想知道有没有更好的算法?可能是O(N)算法

  • 问题内容: 创建一个将根据年份重置的序列。考虑以9位数开头000000001且最大为999999999的序列。 假设Date为30/12/2017,seq为000012849,所以当日期为01/01/2018时,我希望seq为000000001。 问题答案: 创建一个定期计划作业,该作业在每年的1月1日午夜重新设置顺序。 类似于(假设您有执行重置的过程):

  • 计算newArr数组所有对象中arr二维数组,比较后返回其中的[[最小值,最小值],[最大值,最大值]]; 要这种结果[[39.867638888888884, 115.39333333333333], [50.97152777777777, 120.31527777777778]]

  • 当我使用beeline connect到hiveserver2时,err消息如下所示。我以前连接过hiveserver2。在我多次连接到hiveserver2之后,会显示此错误。我可以使用jdbc:hive2://连接 SLF4J:类路径包含多个SLF4J绑定。slf4j:在[jar:file:/usr/local/hive/lib/log4j-Slf4j-impl-2.4.1.jar!/org/