ВХОД:
df1
Pg x0 y0 x1 y1 Text
1 521.3 745.92 537.348 754.097 word1
1 538.982 745.92 580.247 754.097 word2
1 527.978 735.253 572.996 747.727 word3
2 268.985 732.36 341.59 746.636 word4
2 344.443 732.36 390.175 746.636 word5
df2
Pg x0 y0 x1 y1 Text T R C
1 507.6 730.8 593.76 754.8 word1 word2 word3 1 1 2
2 334.56 732.36 401.34 746.636 word5 2 3 1
Ожидаемый ВЫХОД:
Pg x0 y0 x1 y1 Text T R C
1 521.3 745.92 537.348 754.097 word1 1 1 2
1 538.982 745.92 580.247 754.097 word2 1 1 2
1 527.978 735.253 572.996 747.727 word3 1 1 2
2 268.985 732.36 341.59 746.636 word4
2 344.443 732.36 390.175 746.636 word5 2 3 1
Мне нужно найти, какие все слова в df1 присутствуют в df2 на основе координат (перекрытия) и , а не на основе текста подхода. После этого мне нужно скопировать значения столбцов [T, R, C] из df2 в df1.
Например: первая строка df2 имеет координаты, которые перекрывают координаты слова word1, word2, word3 из df1. Перекрытие здесь означает, что bbox (x0, y0, x1, y1) строки в df1 должен лежать внутри bbox (x0, y0, x1, y1) определенной строки df2.
Мой подход:
Я перебираю каждую строку в df2, а затем сравниваю каждую координату строки из df1, чтобы найти перекрытия, а затем объединяю кадры данных.
for i, r in df2.iterrows():
df1.loc[
(df1.x0 >= r.x0) &
(df1.y0 >= r.y0) &
(df1.x1 <= r.x1) &
(df1.y1 <= r.y1) , 'flag'] = 1
df1.loc[df.flag == 1, ['T', 'R', 'C']] = r.T, r.R, r.C
Проблема в том, что весь процесс работает должным образом, как и ожидалось, но для его запуска требуется много времени. Для запуска df1 = 20000 строк и df2 = 3500 строк требуется 90 seconds
.