Замена повторяющихся ID в датасете

awd2021

Новичок
Пользователь
Июн 3, 2021
2
0
1
В csv файле +1М записей типа:

product_id;product_name
FUR-BO-10000112;Mania Corner Shelving, Pine
FUR-BO-10000112;Bush Birmingham Collection Bookcase, Dark Cherry
FUR-BO-10000668;Sauder Classic Bookcase, Mobile
FUR-BO-10000668;Ikea Corner Shelving, Traditional
FUR-BO-10002204;Mania Floating Shelf Set, Traditional
FUR-BO-10002204;Bush Corner Shelving, Traditional
FUR-BO-10002204;Bush Classic Bookcase, Pine

Встречаются записи с одинаковым product_id, но разным product_name. Как с помощью python добавить, допустим, '-1' к product_id с другим product_name?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Как с помощью python добавить, допустим, '-1' к product_id с другим product_name?
Можно так например:
Python:
product_ids = []  # список уникальных product_id
number = 1  # номер для добавления к product_id
last_id = ''  # product_id последней обработанной строки

# data.csv - файл с данными, data2.csv - файл с измененными product_id
with open('data.csv', 'r', encoding='utf-8') as file1, \
     open('data2.csv', 'w', encoding='utf-8') as file2:
    # записываем заголовок в файл
    file2.write(next(file1))
    # в цикле проходим по всем строкам
    for line in file1:
        product_id, product_name = line.strip().split(';')
        # если id нет в списке - добавляем
        if product_id not in product_ids:
            product_ids.append(product_id)
        # если есть, то добавляем к нему '-{number}'
        else:
            number = 1 if product_id != last_id else number + 1
            last_id = product_id
            product_id += f'-{number}'
        # записываем строку в файл
        file2.write(f'{product_id};{product_name}\n')
Результат будет выглядеть так:
Код:
product_id;product_name
FUR-BO-10000112;Mania Corner Shelving, Pine
FUR-BO-10000112-1;Bush Birmingham Collection Bookcase, Dark Cherry
FUR-BO-10000668;Sauder Classic Bookcase, Mobile
FUR-BO-10000668-1;Ikea Corner Shelving, Traditional
FUR-BO-10002204;Mania Floating Shelf Set, Traditional
FUR-BO-10002204-1;Bush Corner Shelving, Traditional
FUR-BO-10002204-2;Bush Classic Bookcase, Pine
 
  • Мне нравится
Реакции: awd2021

awd2021

Новичок
Пользователь
Июн 3, 2021
2
0
1
Спасибо, stud_55,

Код работает, но есть 2 нюанса:

1. Он обрабатывает только 1439 строк, дальше:

C:\Users\user\AppData\Local\Microsoft\WindowsApps\python3.9.exe C:/Users/user/Desktop/CSVs/python_0.py
Traceback (most recent call last):
File "C:\Users\user\Desktop\CSVs\python_0.py", line 14, in <module>
product_id, product_name = line.strip().split(';')
ValueError: too many values to unpack (expected 2)

2. Меняются product_id также у позиций с одинаковым product_name, а это не гут.

Прилагаю исходник products.csv и результат работы скрипта products1.csv
 

Вложения

  • products1.zip
    592 КБ · Просмотры: 1

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
ValueError: too many values to unpack (expected 2)

Ошибка возникла потому, что в 1440й строке в названии был символ ;.

Меняются product_id также у позиций с одинаковым product_name, а это не гут.

Вот код с учетом проверки названий:

Python:
products = {}  # словарь {product_id: [product_name, product_name, ...]}

with open('products.csv', 'r', encoding='utf-8') as file1, \
     open('products1.csv', 'w', encoding='utf-8') as file2:
    # записываем заголовок в файл
    file2.write(next(file1))
    # в цикле проходим по всем строкам
    for line in file1:
        product_id, product_name = line.strip().split(sep=';', maxsplit=1)
        # если id нет в словаре - добавляем
        if product_id not in products:
            products[product_id] = [product_name]
        # если есть, то проверяем название
        else:
            # если его нет в списке для данного id - добавляем
            if product_name not in products[product_id]:
                products[product_id].append(product_name)
            # number - это индекс названия в списке
            number = products[product_id].index(product_name)
            # если он больше 0, то добавляем его к product_id
            if number > 0:
                product_id += f'-{number}'
        # записываем строку в файл
        file2.write(f'{product_id};{product_name}\n')
 

Форум IT Специалистов