Присвоить уникальный 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 шт):
Если вы будете приводить эту таблицу к другому ввиду, то вам соответственно придётся её перебирать, при переборе можно завести переменную, которая будет id и прибавлять к ней 1 при следующем проходе цикла. Если вы будете помещать всё это в бд, то бд умеют сами проставлять уникальный id
Если я правильно понял, то ты уже смог прочитать таблицу и как-то с ней оперировать.
В первую очередь было бы неплохо привести русское название характеристики к англоязычному варианту, раз у тебя так стоит в задаче. Для этого можно просто создать словарик, либо, если совсем хочется автоматизации, использовать 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]
Намного изящнее, как мне кажется. И проще ?
Путем изобретения велосипеда - нашел сложное, громоздкое, но рабочее решение(выкладываю с комментами и отладочными принтами):
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)