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
|
Эти улучшения делают код более эффективным и устойчивым к ошибкам.