熊猫总和

时间:2019-09-24 12:53:25

标签: pandas syntax cumsum

我有一个熊猫数据框,它是这样的:

 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列的语法有所帮助。

2 个答案:

答案 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