Сравнение многомерного списка на уникальность по заданным значениям
Есть многомерный список примерно в 20К строк.
Значения КОД, ЦЕНА, НАИМЕНОВАНИЕ, КАРТИНКА:
list_ = [[1, 10.00, 'помидор', 'путь к jpg'], [1, 11.00, 'помидор', 'путь к jpg'], [2, 20.00, 'яблоко', None], [2, 25.00, 'яблоко', 'путь к jpg'], [3, 25.00, 'Банан', 'путь к jpg'], [4, 25.00, 'Персик', None]
Не получается сравнить список на уникальность по коду и мин. цене.
Результат должен быть:
list_2 = [[1, 10.00, 'помидор', 'путь к jpg'], [2, 20.00, 'яблуко', None], [3, 25.00, 'Банан', 'путь к jpg'], [4, 25.00, 'Персик', None]
unique , и set результат не дали.
Кто-то уже сталкивался с подобной проблемой?
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Воспользуйтесь модулем Pandas:
import pandas as pd # pip install pandas
создаем Pandas DataFrame из списка записей:
df = pd.DataFrame(list_, columns=["ID", "price", "name", "path"])
получилось:
In [93]: df
Out[93]:
ID price name path
0 1 10.0 помидор путь к jpg
1 1 11.0 помидор путь к jpg
2 2 20.0 яблоко None
3 2 25.0 яблоко путь к jpg
4 3 25.0 Банан путь к jpg
5 4 25.0 Персик None
убираем дубликаты, оставляя записи с минимальной ценой:
res = df.sort_values("price").drop_duplicates(subset=["ID"])
результат:
In [95]: res
Out[95]:
ID price name path
0 1 10.0 помидор путь к jpg
2 2 20.0 яблоко None
4 3 25.0 Банан путь к jpg
5 4 25.0 Персик None
результат в виде списка:
res_list = res.to_numpy().tolist()
In [97]: res_list
Out[97]:
[[1, 10.0, 'помидор', 'путь к jpg'],
[2, 20.0, 'яблоко', None],
[3, 25.0, 'Банан', 'путь к jpg'],
[4, 25.0, 'Персик', None]]
UPD:
В колонке "Прайс" есть цены в виде строки, '25.00'. как на лету их преобразовать в float.
df = pd.DataFrame(list_, columns=["ID", "price", "name", "path"])
df["price"] = pd.to_numeric(df["price"], errors="coerce")
res = df.sort_values("price").drop_duplicates(subset=["ID"])