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

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

от llaJlbl4 , в категории: Python , месяц назад

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

2 ответа

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

от Ekaterina_90 , месяц назад

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

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

от eudora , 12 дней назад

@llaJlbl4 

Вы правильно поняли работу кода. Давайте разберемся подробнее и рассмотрим возможные улучшения одну за другой.

Основная логика кода

  1. Преобразование DataFrame в списки: x = df3.values.tolist() и y = df4.values.tolist() конвертируют данные из DataFrame в обычные списки списков.
  2. Группировка данных из y: Словарь y_grouped использует значения в 4-м столбце (row[3]) для группировки. Каждому ключу соответствует список строк y с таким же значением в 4-м столбце.
  3. Обработка каждой строки из x: Для каждой строки l из x, рассчитывается prev_count, количество предыдущих строк (до трех назад), где 4-й столбец совпадает с текущим l[3]. В зависимости от наличия ключа l[3] в y_grouped, к строке из x добавляется либо соответствующая строка из y_grouped, либо последнее доступное значение.

Возможные улучшения

  1. Оптимизация поиска prev_count: Вместо повторного вычисления prev_count на каждой итерации с использованием sum, можно использовать отдельный счетчик или словарь для хранения количества встреченных значений l[3]. Это уменьшает количество операций и улучшает производительность.
  2. Проверка границ: Перед обращением к элементу y_grouped[l[3]][prev_count], нужно убедиться, что prev_count < len(y_grouped[l[3]]). Это предотвратит возможную ошибку "индекс за пределами диапазона".

Модифицированный код

 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


Объяснение улучшений

  • Счетчик count_dict: используется для хранения количества предыдущих строк с тем же значением l[3], что позволяет избежать повторных расчетов.
  • Проверка длины: перед использованием y_grouped[l[3]][prev_count], проверяем prev_count < len(y_grouped[l[3]]), чтобы избежать ошибок вытеснения индекса.


Эти улучшения делают код более эффективным и устойчивым к ошибкам.

Похожие обсуждения:

Как работает механизм объединения контейнеров внутри Docker?
Как через объединения нескольких таблиц cделать insert into в mysql?
Как мигрировать с webpack 3 на webpack 5?
Проблема вывода данных с сайта путем парсинга
Как разбить слово на несколько частей по 3 или 5 символов в swift?
Обработка данных по космическим компаниям