当一个单元格值介于两个值之间,而下一个单元格或多个单元格位于相同值之间时,如何选择panda行



给定以下熊猫数据帧:

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。

最新更新