Pandas 根据条件计算行数

Pandas 根据条件计算行数,pandas,Pandas,这里是我的数据帧的一个很小的子集。原始数据帧非常大 df = pd.DataFrame({ 'XX_111':[-14,-90,-90,-96,-91,-5,-98,-74,-96,-45,-11,-54,-45], 'YY_222':[-103,0,-110,-114,-114,-113,-114,-115,-113,-111,-112,-122,-113], 'ZZ_111':[1,2,3,5,

这里是我的数据帧的一个很小的子集。原始数据帧非常大

    df = pd.DataFrame({
               'XX_111':[-14,-90,-90,-96,-91,-5,-98,-74,-96,-45,-11,-54,-45],
               'YY_222':[-103,0,-110,-114,-114,-113,-114,-115,-113,-111,-112,-122,-113],
               'ZZ_111':[1,2,3,5,6,6,7,7,4,8,9,2,6],
               'value':[1,1,2,3,3,1,2,2,2,3,3,1,1]
    })
您可以看到“value”列下的值总是按1,2,3的顺序排列。我想要的是创建一个新的列'id',并像这样填充它

    value      id
     1         1
     1         1
     2         1
     3         1        
     3         1
     1         2
     2         2
     2         2
     2         2
     3         2
     3         2
     1         3
     1         3
所以每次值从3变为1时,我希望它将id增加1。有没有办法做到这一点,也有效率?

使用:

df['id'] = df['value'].diff().eq(-2).cumsum() + 1
输出:

    XX_111  YY_222  ZZ_111  value  id
0      -14    -103       1      1   1
1      -90       0       2      1   1
2      -90    -110       3      2   1
3      -96    -114       5      3   1
4      -91    -114       6      3   1
5       -5    -113       6      1   2
6      -98    -114       7      2   2
7      -74    -115       7      2   2
8      -96    -113       4      2   2
9      -45    -111       8      3   2
10     -11    -112       9      3   2
11     -54    -122       2      1   3
12     -45    -113       6      1   3
使用:

输出:

    XX_111  YY_222  ZZ_111  value  id
0      -14    -103       1      1   1
1      -90       0       2      1   1
2      -90    -110       3      2   1
3      -96    -114       5      3   1
4      -91    -114       6      3   1
5       -5    -113       6      1   2
6      -98    -114       7      2   2
7      -74    -115       7      2   2
8      -96    -113       4      2   2
9      -45    -111       8      3   2
10     -11    -112       9      3   2
11     -54    -122       2      1   3
12     -45    -113       6      1   3
我会用

In [166]: df['id'] = (df.value.shift().eq(3) & df.value.eq(1)).cumsum() + 1

In [167]: df
Out[167]:
    XX_111  YY_222  ZZ_111  value  id
0      -14    -103       1      1   1
1      -90       0       2      1   1
2      -90    -110       3      2   1
3      -96    -114       5      3   1
4      -91    -114       6      3   1
5       -5    -113       6      1   2
6      -98    -114       7      2   2
7      -74    -115       7      2   2
8      -96    -113       4      2   2
9      -45    -111       8      3   2
10     -11    -112       9      3   2
11     -54    -122       2      1   3
12     -45    -113       6      1   3

注意:如果您有任何差异为2的数字对,请不要使用
diff
。例如5、3、x等等。

我会使用

In [166]: df['id'] = (df.value.shift().eq(3) & df.value.eq(1)).cumsum() + 1

In [167]: df
Out[167]:
    XX_111  YY_222  ZZ_111  value  id
0      -14    -103       1      1   1
1      -90       0       2      1   1
2      -90    -110       3      2   1
3      -96    -114       5      3   1
4      -91    -114       6      3   1
5       -5    -113       6      1   2
6      -98    -114       7      2   2
7      -74    -115       7      2   2
8      -96    -113       4      2   2
9      -45    -111       8      3   2
10     -11    -112       9      3   2
11     -54    -122       2      1   3
12     -45    -113       6      1   3

注意:如果您有任何差异为2的数字对,请不要使用
diff
。例如5、3、x等等。

df.value.diff().lt(0.cumsum()+1
df.value.diff().lt(0.cumsum()+1