Ускорить работу при фильтрации значений в Pandas

Есть некая переменная, и если один из параметров строки отличается от параметра предыдущей строки на значение, больше этой переменной, то строку заносим в таблицу, в противном случае пропускаем. Первое, что пришло в голову, привожу ниже, вопрос, можно ли ускорить процесс?

Код:

import pandas as pd
import openpyxl
from datetime import datetime
excel = pd.read_excel("some_excel.xlsx")
start_time = datetime.now()
new_excel = pd.DataFrame()

print("считано")
index_begin = excel[excel['Дата и время записи'] == "18 августа 2022 г. 7:58:28.012 мсек"].index[0]
index_end = excel[excel['Дата и время записи'] == "18 августа 2022 г. 7:58:36.022 мсек мсек"].index[0]
new_excel = new_excel._append(excel.iloc[0])
len_columns = len(excel.columns)
accuracy = 1
for i in range(index_begin+1, index_end+1):
    for j in range(2, len_columns):
        if abs((excel.iloc[i][j] - excel.iloc[i-1][j])) > accuracy:
            new_excel = new_excel._append(excel.iloc[i])
            break
    print(i)
new_excel.to_excel("excel_exit.xlsx",)
print(datetime.now() - start_time)

Ссылка на сам эксель: https://docs.google.com/spreadsheets/d/1b4XJJOBMgVPUXmXyFc3b073Qn3jw1pji/edit?usp=sharing&ouid=106691183052162552515&rtpof=true&sd=true


Ответы (1 шт):

Автор решения: strawdog

В общих чертах я бы сделал несколько оптимизаций.
Генерируем фрейм для примера:

import pandas as pd
import numpy as np

rng = np.random.default_rng(seed=42)
df = pd.DataFrame(rng.integers(4, size=(10,5)), index=[f"a{x}" for x in range(10)])
print(df)
    0  1  2  3  4
a0  0  3  2  1  1
a1  3  0  2  0  0
a2  2  3  2  3  2
a3  3  2  0  3  1
a4  2  1  0  3  3
a5  2  1  3  2  1
a6  1  0  0  2  3
a7  0  3  3  1  2
a8  0  3  2  1  0
a9  3  1  3  2  3

теперь просто локатором выделяем нужный нам кусок датафрейма:

df_ = df.loc["a2":"a7"]

а затем проверяем на условие (не забывая указать axis):

accuracy = 1
res = df_[df_.diff(axis=1).abs().gt(accuracy).any(axis=1)]

получаем датафрейм res, в котором остались только строки, в которых хоть один элемент отличается от соседнего более, чем на accuracy:

    0  1  2  3  4
a3  3  2  0  3  1
a4  2  1  0  3  3
a5  2  1  3  2  1
a6  1  0  0  2  3
a7  0  3  3  1  2

UPDATE*

в вашем конкретном случае:

import pandas as pd

excel = pd.read_excel("some_excel.xlsx")

index_begin = excel.loc[(excel['Дата и время записи'] == '18 августа 2022 г. 7:58:28.012 мсек')].index[0]
index_end = excel.loc[(excel['Дата и время записи'] == '18 августа 2022 г. 7:58:36.022 мсек')].index[0]
df_ = excel.loc[index_begin:index_end]
accuracy = 1
res = df_[df_.iloc[:,2:].diff(axis=1).abs().gt(accuracy).any(axis=1)]

res:

   RecordID                  Дата и время записи  п1  п2
4         5  18 августа 2022 г. 7:58:32.002 мсек   3   5
5         6  18 августа 2022 г. 7:58:33.002 мсек   5  10
6         7  18 августа 2022 г. 7:58:34.002 мсек   9  12
→ Ссылка