x = df3.values.tolist()
y = df4.values.tolist()
lst = []
y_grouped = {}
for row in y:
key = row[3]
if key not in y_grouped:
y_grouped[key] = []
y_grouped[key].append(row)
for idx, l in enumerate(x):
if idx == 0:
prev_count = 0
else:
prev_count = sum(1 for j in range(max(0, idx-3), idx) if x[j][3] == l[3])
if l[3] in y_grouped:
if len(y_grouped[l[3]]) > prev_count:
lst.append(l + y_grouped[l[3]][prev_count])
else:
lst.append(l + y_grouped[l[3]][-1]) # Берем последнее доступное значение
else:
lst.append(l)
print(idx)
lst
@llaJlbl4 Этот код выполняет объединение данных из двух списков (x
и y
), полученных из df3
и df4
. Давай разберем его работу:
x = df3.values.tolist()
и y = df4.values.tolist()
– преобразуют DataFrame
в список списков.
Создается словарь y_grouped
, в котором ключ – это значение из 4-го столбца (row[3]
), а значение – список всех строк y
, имеющих этот ключ.
Для каждой строки l
в x
:
prev_count
, то есть количество предыдущих строк (до трех назад), у которых 4-й столбец совпадает с текущим l[3]
.l[3]
есть в y_grouped
, берется prev_count
-я запись из y_grouped[l[3]]
, иначе – последняя доступная запись.l[3]
нет в y_grouped
, строка l
остается без изменений.print(idx)
– просто выводит индекс текущей строки x
в процессе итерации.
prev_count
: вместо перебора через sum(1 for j in range(...))
, можно вести отдельный счетчик.y_grouped[l[3]]
: проверять prev_count < len(y_grouped[l[3]])
перед обращением.