Парсинг и фильтрация CSV файлов
Пример содержимого CSV файла:
название;цена;доставка
Аренда топ игрового компьютера на RTX 2060/2070;398;нет доставки
Ноутбук Aorus RTX 2070 240Hz;150000;нет доставки
Игровой пк 2700x, RTX 2070 Super, 32 Gb DDR4;95000;нет доставки
Игровой пк rtx 2070 i5 9400f монитор/мышь/клава;70000;нет доставки
HP omen 15 dh0026ur 4k RTX 2070 новый;140000;есть доставка
Игровой пк - RTX2070 Super 8Gb, i5 9400F, 16Gb;86000;есть доставка
Игровой процессор на RTX2070 и i5-9600;90000;есть доставка
Asus Strix RTX 2070 8Gb;31000;нет доставки
Gigabyte Geforce RTX 2070 Windforce (8гб);32500;нет доставки
RTX 2070 Super Asus Rog Strix OC Обмен;39990;есть доставка
Игровой компьютер AMD Ryzen 5/24GB/RTX2070/1TB SSD;85000;нет доставки
Задача, вывести строки, которые попадают в интервал цены - от и до (второй столбец файла), и записать их в другой файл.
Решение задачи предложенное @MaxU:
import pandas as pd
price_ot = 5000
price_do = 300000
delivery = 'есть доставка'
brand = 'Aorus'
(pd
.read_csv('data.csv', sep=';')
.query('@price_ot <= `цена` <= @price_do and @delivery in `доставка` and @brand in `название`')
.to_csv('new_data.csv', sep=';', index=False))
Есть ли способ, который позволяет сделать фильтр не по полному вхождению, как сейчас для delivery, а по отдельному слову в ячейке, например нужно оставить строки в которых содержится только вхождение одного слова 'Aorus' в первом столбце?
Ответы (2 шт):
Воспользуйтесь модулем Pandas:
import pandas as pd # pip install pandas
price_from = 30000
price_to = 35000
delivery = ["есть доставка"]
qry = "@price_from <= `цена` <= @price_to and `доставка` in @delivery"
(pd
.read_csv(filename, sep=";")
.query(qry)
.to_csv(new_filename, sep=";", index=False))
Есть ли способ, который позволяет сделать фильтр не по полному вхождению, как сейчас для delivery, а по отдельному слову в ячейке, например нужно оставить строки в которых содержится только вхождение одного слова 'Aorus' в первом столбце?
Воспользуйтесь методом Series.str.contains("reg_ex"):
df = pd.read_csv(filename, sep=";")
res = df.loc[df["название"].str.contains("Aorus")]
результат:
In [8]: res
Out[8]:
название цена доставка
5 Ноутбук Aorus RTX 2070 240Hz 150000 нет доставки
данный метод можно комбинировать с фильтрацией из другого ответа:
df = pd.read_csv(filename, sep=";")
res = df.query(qry).loc[lambda x: x["название"].str.contains(r"i[79]")]
результат:
In [9]: res
Out[9]:
название цена доставка
2 Intel Core i7 + Nvidia RTX 2070/2060 33900 есть доставка