#python #list #csv #group-by
Вопрос:
У меня есть csv, который выглядит следующим образом,
#cars.csv
Bugatti, Veyron
Bugatti, Chiron
VW, Golf
VW, Passat
VW, Polo
VW, Caddy
Opel, Insignia
Я хочу создать два отдельных списка, подобных этому:
brands = ["Bugatti","VW","Opel"]
models = [["Veyron","Chiron"],
["Golf","Passat","Polo","Caddy"],
["Insignia"]]
Есть ли какой-либо возможный способ сделать это без pandas? У меня проблемы с импортом pandas, поэтому я ищу альтернативный способ сделать это.
Любая помощь приветствуется!
Комментарии:
1. почему бы вам вместо этого не спросить о том, как устранить неполадки при установке pandas? есть ли какое-либо сообщение об ошибке при установке pandas?
Ответ №1:
Поехали:
import csv
file = open("cars.csv")
csvreader = csv.reader(file)
rows = [i for i in csvreader]
brands = []
models = []
for brand, model in rows:
if brand in brands:
models[brands.index(brand)].append(model)
else:
brands.append(brand)
models.append([model])
file.close()
Комментарии:
1. Большое вам спасибо! Можете ли вы объяснить мне, для чего rows = [i для i в csvreader] ? Я очень новичок
2. Он получает список столбцов каждой строки. пример: [[«Bugatti», «Veyron»], [«Bugatti», «Chiron»] ..]
Ответ №2:
from collections import defaultdict
def parse(file, delimiter=', '):
with open(file) as f:
result = defaultdict(list)
for line in f.readlines():
brand, model = line.split(delimiter)
result[brand].append(model)
return result
result = parse('cars.csv')
# fit the special data format
brands = list(result.keys())
models = [result[key] for key in brands]
Если у вас есть какие-либо вопросы, пожалуйста, скажите мне.
Ответ №3:
Вы могли бы взглянуть на библиотеку convtools, которая предоставляет множество примитивов для обработки данных
from convtools import conversion as c
from convtools.contrib.tables import Table
# prepare converter (this is where code generation happens, so
# it's better to store the converter somewhere for further reuse)
converter = (
c.group_by(c.item("brand"))
.aggregate(
{
"brand": c.item("brand"),
"models": c.ReduceFuncs.ArrayDistinct(c.item("model")),
}
)
.pipe(
{
"brands": c.iter(c.item("brand")).as_type(list),
"models": c.iter(c.item("models")).as_type(list),
}
)
.gen_converter()
)
# read the csv
rows = Table.from_csv(
"cars.csv",
header=["brand", "model"],
dialect=Table.csv_dialect(skipinitialspace=True),
).into_iter_rows(dict)
# process the rows
assert converter(rows) == {
"brands": ["Bugatti", "VW", "Opel"],
"models": [
["Veyron ", "Chiron"],
["Golf", "Passat", "Polo", "Caddy"],
["Insignia"],
],
}