使用Pandas和R创建序列总和

时间:2016-11-05 13:10:36

标签: r pandas cumulative-sum derived-column

enter image description here

大家好我想用ID,月和值计算序列和标志。 对于每个唯一的id,如果值变为零,则sequence为1,如果连续几个月继续为零,则序列将如上所示添加。

当序列加到6时,标志将为1。

请帮助我想用Pandas和R

来做

2 个答案:

答案 0 :(得分:0)

R中,我们可以使用data.table创建'序列'和'标记'。将'data.frame'转换为'data.table'(setDT(df1)),按'Id'分组,我们用Value == 0指定'i',创建'Sequence'作为序列({ {1}})基于'i'中的TRUE值。然后,通过为“序列”为1的元素分配(1:.N)1来创建“标志”。如果'Id'没有1或:='Flag'值为NA,则从顶部连接0,同时从'Flag'(all)或{{1}中删除一个元素}返回'标志'

Flag[-1]

注意:最好将NA作为缺失值而不是空白(else)来保留列的类。

数据

library(data.table)
setDT(df1)[Value == 0, Sequence := 1:.N , by = Id]
df1[Sequence ==1, Flag := 1][, Flag := if(all(is.na(Flag))) 
                     c(0, Flag[-1]) else Flag, by = Id]
df1
#        Id  Month Value Sequence Flag
# 1: SCSR1 Jan-16   400       NA   NA
# 2: SCSR1 Feb-16     0        1    1
# 3: SCSR1 Mar-16     0        2   NA
# 4: SCSR1 Apr-16     0        3   NA
# 5: SCSR1 May-16     0        4   NA
# 6: SCSR1 Jun-16     0        5   NA
# 7: SCSR1 Jul-16     0        6   NA
# 8: SCCS9 Jan-16   440       NA    0
# 9: SCCS9 Feb-16  3000       NA   NA
#10: SCCS9 Mar-16   400       NA   NA
#11: SCCS9 Apr-16   100       NA   NA
#12: SCCS9 May-16   300       NA   NA
#13: SCCS9 Jun-16   400       NA   NA
#14: SCCS9 Jul-16   100       NA   NA
#15: SKHH1 Jan-16  1000       NA   NA
#16: SKHH1 Feb-16     0        1    1
#17: SKHH1 Mar-16     0        2   NA
#18: SKHH1 Apr-16     0        3   NA
#19: SKHH1 May-16     0        4   NA
#20: SKHH1 Jun-16     0        5   NA
#21: SKHH1 Jul-16     0        6   NA

答案 1 :(得分:0)

下面的熊猫解决方案。

请注意,如果值在Id中切换回非零值,则下面的序列列将通过复制最后一个值(例如,1,2,3,4,5,6,6,6,6,... )。这可以通过移动Value列来清理,就像我们执行Id列并在Id中进行比较一样。但是,如果值可以在Id内在0和非零之间振荡,则累积和方法会中断。如果这没有发生,这种方法应该没问题。我很想知道是否还有其他解决方案可以解决这个问题。

make VERBOSE=1

@akrun已经给你一个漂亮的R解决方案。另一种方法是使用rleid函数。但我更喜欢@ akrun的解决方案。