大家好我想用ID,月和值计算序列和标志。 对于每个唯一的id,如果值变为零,则sequence为1,如果连续几个月继续为零,则序列将如上所示添加。
当序列加到6时,标志将为1。
请帮助我想用Pandas和R
来做答案 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的解决方案。