我有一个熊猫数据框,它是这样的:
x y
1 0
2 1
3 2
4 0 <<<< Reset
5 1
6 2
7 3
8 0 <<<< Reset
9 1
10 2
x
值可以是任何值,它们对于这个问题没有意义。 y值递增,然后重置并再次递增。我需要第三列(z)
,它是代表组的数字,因此当y值重置时,它会递增。
我不能保证重置将为零,只有小于前一个的值才应指示重置。
x y z
1 0 0
2 1 0
3 2 0
4 0 1 <<<< Incremented by 1
5 1 1
6 2 1
7 3 1
8 0 2 <<<< Incremented by 1
9 1 2
10 2 2
因此,要生成z
,我不了解语法就知道需要做什么。我的解决方案是首先将z
分配为0和1的稀疏列,其中所有内容均为零,但在y[ix] < y[ix-1]
时给出1除外,这表明y
计数器已重置。然后,应在z
列上执行累计运行总和,这意味着:z[ix] = sum(z[0],z[1],...,z[ix])
如果有人有空,Id希望您能对分配z列的语法有所帮助。
答案 0 :(得分:2)
根据您的逻辑:
#general case
df['z'] = df['y'].diff().lt(0).cumsum()
# or equivalently
# df['z'] = df['y'].lt(df['y'].shift()).cumsum()
输出:
x y z
0 1 0 0
1 2 1 0
2 3 2 0
3 4 0 1
4 5 1 1
5 6 2 1
6 7 3 1
7 8 0 2
8 9 1 2
9 10 2 2
答案 1 :(得分:2)
使用ne(1)
df.y.diff().ne(1).cumsum().sub(1)
0 0
1 0
2 0
3 1
4 1
5 1
6 1
7 2
8 2
9 2
Name: y, dtype: int32