Вы можете использовать pd.cut
, чтобы связать значения в b
в соответствии с ranges
и удалить те, которые duplicated
:
ranges = np.array([0, 2, 4, 6, 8, 10])
df[~(pd.cut(df.b, ranges, include_lowest=True, right=False)).duplicated()]
a b
0 1 0
2 9 5
3 3 9
4 5 6
Где:
pd.cut(df.b, ranges, include_lowest=True, right=False)
0 [0, 2)
1 [0, 2)
2 [4, 6)
3 [8, 10)
4 [6, 8)
Name: b, dtype: category
Обновление
Если вы хотите использовать конкретную обрезку разрешенных дублированных значений, вы можете сгруппировать по интервалам, возвращаемым pd.cut
и выберите первые n
значения, которые дублируются с помощью [head
], чтобы выбрать первые n
строки, принадлежащие к тому же интервалу.
Следующее - тот же кадр данных, что и у вас сдополнительная строка, поэтому функциональность понятнее:
print(df)
a b
0 1 0
1 7 0
2 7 0
3 9 5
4 3 9
5 5 6
cuttoff = 2
g = pd.cut(df.b, ranges, include_lowest=True, right=False)
df.groupby(g).head(cuttoff)
a b
0 1 0
1 7 0
3 9 5
4 3 9
5 5 6