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