Парсинг и фильтрация 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 шт):

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

Воспользуйтесь модулем 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))
→ Ссылка
Автор решения: MaxU

Есть ли способ, который позволяет сделать фильтр не по полному вхождению, как сейчас для 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  есть доставка
→ Ссылка