使用最后计算值在Pandas中进行连续计算

时间:2014-10-27 01:42:17

标签: python pandas

任何人都可以建议一种顺序应用函数的方法,这样不仅可以使用计算列的最后计算值,还可以使用pandas数据帧中其他列的当前值和过去值。

为了说明我的用例,假设我有以下数据框"开始"和"结束"事件的标记,我需要用" 1"标记事件的发生。在名为" Event"的新专栏中。 列说明:

  • 开始 :当条件导致事件开始时标记为1,如果此列中有1,那么它将指示事件的开始或者即使End列有2。
  • ,现有事件仍将继续
  • 结束 :当条件导致事件结束时,如果“开始”列为0,则标记为2,如果“开始”为1,则值不会产生任何影响关于正在进行的活动。
  • 事件 :需要对此列进行计算,以便为运行该事件的行标记1。

示例中的逻辑是我以1开始事件并在1和2重叠时结束它,或者在1结束后立即结束它。

    Start   End   Event
1   0       0     0
2   1       2     1
3   1       2     1
4   0       0     0
5   0       0     0
6   0       0     0
7   1       0     1
8   0       2     1
9   0       2     0
10  0       0     0

据我所知,如果我能找到一种使用当前行中其他列的值顺序实现函数的方法,我可以在这些列上使用.shift(...)轻松使用它们的过去值。到目前为止,我已经找到了一个顺序计算的python实现,但只在同一列上:https://groups.google.com/forum/#!topic/pydata/0MCWhwurOWs 和python代码:https://github.com/pydata/pandas/issues/4567

我从未使用过cython,并且想知道是否可以使用上面的方法来实现它。

基本上,我发现pandas中缺少的是简单的计算方法,其中我不仅可以引用其他列的值,还可以引用同一列的计算值来计算当前行。这很困难,因为pandas是基于列的,并应用基于列的数组函数。

我真的很感激这方面的帮助。

1 个答案:

答案 0 :(得分:0)

好吧即使在澄清之后,你的问题仍然没有明确定义,你给出的例子打破了你自己的定义,因为从第2行开始的事件永远不会结束,因为第3行和第4行都不满足你目前所说的最终条件: ("如果Start == 1,则值End == 2对正在运行的事件没有任何影响(?!)")

但是这里有一个大纲解决方案供你调整,你可以想出其余部分:

  • 您需要的工具是diffcumsum。您还需要进行一些布尔计算。
  • diff()会给你正面和负面的差异;因为您只对最早的积极变化感兴趣,然后比较diff(...) == +1的输出
  • 这里我们计算两个中间向量event_started,event_ended,然后将它们转换为整数,这样我们就可以做一个累积求和cumsum(as.integer(event_started) - as.integer(event_ended)),看起来大概是你想要的:

df <- data.frame(Start=c(0,1,1,0,0,0,1,0,0,0), End=c(0,2,2,0,0,0,0,2,2,0))

event_started <- c(F, diff(df$Start)) == +1
FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
event_ended   <- c(F, diff(df$End==2) == +1) & !event_started
FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

cumsum(as.integer(event_started) - as.integer(event_ended))
0 1 1 1 1 1 2 1 1 1

df$Event <- cumsum(as.integer(event_started) - as.integer(event_ended))