任何人都可以建议一种顺序应用函数的方法,这样不仅可以使用计算列的最后计算值,还可以使用pandas数据帧中其他列的当前值和过去值。
为了说明我的用例,假设我有以下数据框"开始"和"结束"事件的标记,我需要用" 1"标记事件的发生。在名为" Event"的新专栏中。 列说明:
示例中的逻辑是我以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是基于列的,并应用基于列的数组函数。
我真的很感激这方面的帮助。
答案 0 :(得分:0)
好吧即使在澄清之后,你的问题仍然没有明确定义,你给出的例子打破了你自己的定义,因为从第2行开始的事件永远不会结束,因为第3行和第4行都不满足你目前所说的最终条件: ("如果Start == 1,则值End == 2对正在运行的事件没有任何影响(?!)")
但是这里有一个大纲解决方案供你调整,你可以想出其余部分:
diff
和cumsum
。您还需要进行一些布尔计算。diff()
会给你正面和负面的差异;因为您只对最早的积极变化感兴趣,然后比较diff(...) == +1
的输出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))