pandas:按与前一列的差值选择行,但每行只能选择一次



我有一个像下面这样的数据集

ID value
1 10
2 15
3 18
4 30
5 35

我想保留所有具有前一行的value - value <=5的行,所以我做

df['diff'] = df.value.diff()
df = df[df.diff <= 5]

那么我将有

ID value diff
2 15 5
3 18 3
5 35 5

然而,我不想保留第3行,因为第2行是根据第1行保留的,当第1行和第2行成为一对时,第3行不应该再与第2行配对了。

我怎么能使用熊猫吗?我确实可以写一个for循环,但这不是最好的主意。

这样就有了检查与前一行差异的遮罩<= 5:

>>> d = df.value.diff().le(5)
>>> d
1    False
2     True
3     True
4    False
5     True

标记为True的行将被保留,但如果前一行也是True,则不希望保留True行。

然后我们可以移动这个掩码,将它和&与原始掩码否定,将前一行有TrueTrue转换为False:

>>> d & ~d.shift(fill_value=False)
1    False
2     True
3    False
4    False
5     True

需要fill_value的地方,否则会出现NaN,并且它"不能按位对float"取反。把False放在那里除了使问题沉默之外没有任何效果。

现在我们可以用这个结果掩码从数据框中选择行:

>>> wanted = d & ~d.shift(fill_value=False)
>>> df[wanted]
ID  value
2   15
5   35

相关内容

  • 没有找到相关文章