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]])
перед обращением.@llaJlbl4
Вы правильно поняли работу кода. Давайте разберемся подробнее и рассмотрим возможные улучшения одну за другой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
x = df3.values.tolist() y = df4.values.tolist() lst = [] y_grouped = {} # Группируем данные из y for row in y: key = row[3] if key not in y_grouped: y_grouped[key] = [] y_grouped[key].append(row) # Счетчик для отслеживания предыдущих встреченных значений count_dict = {} # Обрабатываем строки из x for idx, l in enumerate(x): if idx == 0: prev_count = 0 else: # Получаем количество предыдущих встреченных значений prev_count = count_dict.get(l[3], 0) if l[3] in y_grouped: if prev_count < len(y_grouped[l[3]]): lst.append(l + y_grouped[l[3]][prev_count]) else: lst.append(l + y_grouped[l[3]][-1]) # Используем последнее доступное значение # Увеличиваем счетчик для этого значения count_dict[l[3]] = prev_count + 1 else: lst.append(l) print(idx) lst |
Эти улучшения делают код более эффективным и устойчивым к ошибкам.