Использование скрипта Python для создания списка словарей, используя данные файла CSV
У меня есть данные в формате
from to
Location1 Location2
Location1 Location3
Location1 Location4
Location1 Location5
Location2 Location1
Location2 Location3
Location3 Location1
Location3 Location2
Location3 Location4
В CSV-файл. Данные карты поездок на велосипеде с одной станции на другую и взяты с веб-сайта компании по прокату велосипедов в Чикаго.
Прямо сейчас у меня есть базовый код, который берет каждую строку и добавляет ее в список, но он не создает словарь во втором индексе, как я желаю. Мой сценарий выглядит так:
import csv
li = []
with open('Desktop/test_Q4_trips.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for name, imports in reader:
li.append({
"name": name,
"imports": imports,
})
del li[0]
Вот вывод,
[{"from": "Location1", "to": "Location2"}, {"from": "Location1", "to": "Location3"},
{"from": "Location1", "to": "Location4"}, {"from": "Location1", "to": "Location5"},
...]
Я хочу преобразовать эти данные в этот формат,
[{"from": "Location1", "to": ["Location2", "Location3", "Location4", "Location5"]},
{"from": "Location2", "to": ["Location1", "Location3"]},
{"from": "Location3", "to": ["Location1", "Location2", "Location4"]}, ...
].
Словом, я хотел бы создать список словарей, где каждый словарь имеет одно значение в первом индексе и список (различно много) значений во втором индексе. В частности, выходные данные должны перечислить все станции, которые находятся на принимающей стороне поездки по прокату велосипедов, в списке во втором индексе. Чтобы сделать это, я предполагаю, что мне нужно будет создать скрипт с циклом for, который перебирает значения "from" слева и добавляет каждое местоположение "to", соответствующее каждому "from" 1, в список.
Я хотел бы, чтобы мои данные были в конкретной форме, о которой я упоминаю, для работы с имеющимся у меня кодом визуализации данных. Я уверен, что создание формата, который я хотел бы, нуждается в скачке, но я не уверен, что именно нужно сделать, чтобы удовлетворить это. Я также не уверен, должен ли тип вывода, который мне нужен, быть списком или массивом, и был бы признателен за разъяснение по этому поводу.
Пожалуйста, помогите мне решить эту проблему, заранее спасибо.
2 ответа
collections.defaultdict
может быть хорошим подходом для решения этой проблемы.
from collections import defaultdict
d = defaultdict(list)
a = [{"from": "Location1", "to": "Location2"}, {"from": "Location1", "to": "Location3"},
{"from": "Location1", "to": "Location4"}, {"from": "Location1", "to": "Location5"}]
for o in a:
d[o['from']].append(o['to'])
print(d)
Это должно работать я думаю
import numpy as np
l = [{"from": "Location1", "to": "Location2"}, {"from": "Location1", "to": "Location3"},
{"from": "Location1", "to": "Location4"}, {"from": "Location1", "to": "Location5"}]
from_to = np.array(([d['from'] for d in l],[d['to'] for d in l])).T
froms = set(from_to[:,0])
out = []
for f in froms:
d = {}
mask = from_to[:,0]==f
d['from']=f
d['to'] = from_to[:,1][mask]
out.append(d)