Ускорить работу при фильтрации значений в 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 шт):
В общих чертах я бы сделал несколько оптимизаций.
Генерируем фрейм для примера:
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