метод объединения данных

Пользователь

от llaJlbl4 , в категории: Python , 16 дней назад

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от Ekaterina_90 , 16 дней назад

@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]]) перед обращением.