Использование скрипта Python для создания списка словарей, используя данные файла CSV

1

У меня есть данные в формате

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" слева и добавляет каждое "в" местоположение, соответствующее каждому "от" одного к списку.

Я хотел бы, чтобы мои данные были в той конкретной форме, о которой я упоминаю, чтобы работать с кодом визуализации данных, который у меня есть. Я уверен, что для создания формата, который мне нужен, необходим скачок в мыслях, но я не уверен, что делать, чтобы это удовлетворить. Я также не уверен, должен ли тип вывода, который мне нужен, быть списком или массивом, и хотел бы получить разъяснения по этому поводу.

Пожалуйста, помогите мне решить эту проблему, спасибо заранее.

  • 0
    Я не думаю, что у формата, который вы разместили, есть разделитель как ','.
Теги:
dictionary
csvtoarray

2 ответа

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)
  • 0
    Это дает выходные данные [{"Location1": ["Location2", "Location3", "Location4", "Location5"]}] не [{"from": "Location1", "to": ["Location2", "Location3", "Location4", "Location5"]}] . Есть идеи, как мне добавить слова «от» и «к» в словарь? Благодарю.
  • 1
    О, извините, просто добавьте следующую строку: res = [{"from": k, "to": v} for k, v in d.items()] до конца, @ AshokB.Raife
Показать ещё 2 комментария
0

Это должно работать, я думаю

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню