我有一个数据框,其定义如下:
df = pd.DataFrame({'A':[5,8,96,3,5,41,2,45,7,8], 'B':[1,2,3,5,6,10,11,12,13,18]})
df = df.set_index('B')
df.index.name = None
我的目标是为具有连续索引的数据帧子集分配如下值:
算法:从图像中可以看出,前3行的索引1,2,3增加1(因此连续)。因此,我将这个子集分配给C列中的值0。 第二子集由具有连续索引5和6的行形成(注意,没有索引4!)。因此,我在C列中为它们指定值1。
问题:您是否知道实现此类结果的有效且智能的方法?我通过使用大量的for循环和ifs来实现这样的结果,但它非常讨厌。
答案 0 :(得分:4)
您可以将diff
与cumsum
一起使用;计算diff
,检查它是否等于1(连续条件),然后cumsum
(计数)非连续跳跃:
df['C'] = df.index.to_series().diff().ne(1).cumsum().sub(1)
df
# A C
#1 5 0
#2 8 0
#3 96 0
#5 3 1
#6 5 1
#10 41 2
#11 2 2
#12 45 2
#13 7 2
#18 8 3