Как сгруппировать строки в список из csv без использования pandas

#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"],
    ],
}