Ключом к успеху является функция, работающая почти так же, как diff()
:
def mark(x):
global prevX
difr = abs(x - prevX)
result = difr >= 2
if not result:
prevX = x
return result
Но различия заключаются в следующем:
- Эта функция использует глобальную переменную "предыдущий x"(
prevX
), содержащий изначально первое length
(программа должна установить его). - Подстановка текущего
x
в prevX
происходит только , еслиразница меньше 2. Таким образом, в этом отношении мы «пропускаем» удаляемые строки.
Первоначальный шаг - установить prevX
на 1-ю длину:
prevX = df.loc[0, 'length']
А фактическая обработка выполняется с помощью одной инструкции:
df.drop(df[df['length'].apply(mark)].index, inplace=True)
Немного объяснения:
df['length'].apply(mark)
генерирует логический массив.True
означает «эта строка должна быть удалена».В целях указания выполните эту команду в одиночку (перед удалением). df[...].index
создает список значений индекса для этих строк. df.drop
удаляет строки с заданными индексами (на месте).
Таким образом, весь скрипт выглядит следующим образом:
import pandas as pd
def mark(x):
global prevX
difr = abs(x - prevX)
result = difr > 2
if not result:
prevX = x
return result
data={ 'length': [ 353.216, 353.514, 273.559, 274.199, 353.813, 354.116 ] }
df = pd.DataFrame(data)
prevX = df.loc[0, 'length']
df.drop(df[df['length'].apply(mark)].index, inplace=True)
Результат:
length
0 353.216
1 353.514
4 353.813
5 354.116
Альтернатива: если вы хотите получить результат в другом Dataframe,удалите inplace=True
и подставьте результат в целевую переменную.