Присвоить уникальный id по названиям в таблице python

Имеется таблица вида:

iphone 10; дисплей; разрешение ; 100х100
iphone 10; дисплей; тип матрицы; amoled 
iphone 10; батарея; емкость    ; 17263mah
...
samsung s20; дисплей; разрешение; 200х200
samsung s20; корпус ;   материал; пластик

То есть, количество характеристик может отличаться.

Моя конечная задача - привести всё к виду базы данных {name:'iphone', definition: '100x100'...}

На данный момент пытаюсь решить задачу присвоения уникального номера для каждого предмета,

Пример:

0; iphone 10; дисплей; разрешение ; 100х100
0; iphone 10; дисплей; тип матрицы; amoled 
0; iphone 10; батарея; емкость    ; 17263mah
...
1; samsung s20; дисплей; разрешение; 200х200
1; samsung s20; корпус ;   материал; пластик

Каким образом это можно сделать?


Ответы (3 шт):

Автор решения: Inventor

Если вы будете приводить эту таблицу к другому ввиду, то вам соответственно придётся её перебирать, при переборе можно завести переменную, которая будет id и прибавлять к ней 1 при следующем проходе цикла. Если вы будете помещать всё это в бд, то бд умеют сами проставлять уникальный id

→ Ссылка
Автор решения: WhiteApfel

Если я правильно понял, то ты уже смог прочитать таблицу и как-то с ней оперировать.

В первую очередь было бы неплохо привести русское название характеристики к англоязычному варианту, раз у тебя так стоит в задаче. Для этого можно просто создать словарик, либо, если совсем хочется автоматизации, использовать API переводчиков.
Аналогично можно поступить и со значением характеристики.

Универсально: Теперь создаёшь пустой словарик (dict) Затем пробегаешься по каждой строке и, если нет в нем нужной модели, создаёшь новую пару ключ-значение в виде название_модели-характеристика_со_строки, иначе просто добавляешь. Код выглядит примерно так:

translate = {"название":"name"} 
models = {}
for line in lines:
    if line[0] not in models:
        models[line[0]] = {translate[line[2]]: line[3]} 
    else:
        models[line[0]] += {translate[line[2]]: line[3]} 

Уникальный id модели можно получить автоматически при добавлении в бд, так как там есть своя система, либо через счётчик, но при последующем обновлении, придётся учитывать количество. Ещё вариант - использовать хэш-сумму названия, либо текущее время ?

UPD

Это же по сути csv. Через pandas можно получить лист unique. Потом его через enumerate пронумеровать, сделать словарь name:id и создать колонку, где значение будет dict[name]

Намного изящнее, как мне кажется. И проще ?

→ Ссылка
Автор решения: Lumxi

Путем изобретения велосипеда - нашел сложное, громоздкое, но рабочее решение(выкладываю с комментами и отладочными принтами):

def get_index():
    f = open('input_table', 'r')
    a = f.readlines()
    count_list = []

    for i in a:
        li = i.split(';')
        lii = li[0]
        count_list.append(lii)

    # print(count_list)
    second_list = []
    new_count_list = []


    a = 0

    for cl in count_list:


        if cl not in second_list:
            a += 1
            second_list.append(cl)
            new_count_list.append(a)

        else:
            new_count_list.append(a)


    f = open('output_list.txt', 'a')
    for i in new_count_list:
        f.write(str(i) + '\n')
    f.close()

    print(second_list)
    print(new_count_list) 

То есть на выходе я получаю столбец с индексами(уникальные для каждого имени), который затем вставляю тем или иным образом в таблицу.

Если это можно решить элегантнее и/или более правильно - буду признателен за дополнения


UPD Решение с применением pandas по мотивам рекомендации WhiteApfel Данное решение лаконичней, сразу вставляет столбец с id

def alt():
    import pandas as pd

    f = open('output_fin/fila.csv', 'r')
    lines = f.readlines()

    llli = [item.split(';')[0] for item in lines]

    unique_ = pd.Series(llli, name='A').unique()

    id_name = {}
    for c, value in enumerate(unique_, 1):
        id_name.update({c:value})

    f2 = open('output_fin/exp3.csv', 'a')
    for line in lines:
        alter = line.split(';')[0]
        for k, v in id_name.items():
            if alter == v:
                f2.write(str(k) + ';' + line)
→ Ссылка