我有一个像下面这样的数据集
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行。
然后我们可以移动这个掩码,将它和&
与原始掩码否定,将前一行有True
的True
转换为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