给定以下熊猫数据帧:
Name speed
---------------
0 A 100
1 A 50
2 A 40
4 A 30
5 A 10
6 B 100
7 B 50
8 B 40
9 B 120
10 A 10
当我们找到10<速度<100,其中下一行的速度也在10和100之间,直到我们找到速度=<10,所以我们选择它们,如果我们发现行速度=>100,我们就不选择它们,继续迭代其他行。结果应该是这样的:
Name speed
---------------
1 A 50
2 A 40
4 A 30
您可以使用between((和shift((来实现这一点:
low = 10
high = 100
mask_next = df.speed.between(low, high, inclusive=False) & (df.speed.shift(-1).between(low, high, inclusive=False))
mask_before = df.speed.between(low, high, inclusive=False) & (df.speed.shift(1).between(low, high, inclusive=False))
df[mask_next | mask_before]
输出:
Name speed
1 A 50
2 A 40
4 A 30
7 B 50
8 B 40
如果每个名字都需要它,你必须循环:
results = []
for name in df.Name.drop_duplicates().to_list():
mask_name = df.Name == name
results.append(df[mask_name & (mask_next | mask_before)])
pd.concat(results)
输出:
Name speed
1 A 50
2 A 40
4 A 30
7 B 50
8 B 40
结果与您的测试数据完全相同。然而,第二种方法检查id 5和10是否满足条件。没有循环的第一种方法将始终丢弃id 10。