Создайте словарь с 4 клавишами, присваивающими значения из списка - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть список из 400+ элементов, но мне нужно в конечном итоге разобрать его в массив данных в пандах с 4 столбцами. Поэтому я подумал, что было бы неплохо преобразовать список, чтобы каждый из 4 элементов получил соответствующее значение из списка.

list = ['1','ABC','ABC001,'ABC002,'2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']

Я хочу создать словарь, который выглядит следующим образом:

Dict = {'Id' : '1', 'TopSite' : 'ABC', 'Floor' : 'ABC001', 'Room' : 'ABC002', 'Id' : '2'.... }

Итак, я попробовал следующее:

columns = ['Id', 'TopSite', 'Floor', 'Room']
list = ['1','ABC','ABC001,'ABC002,'2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
DataDict = [dict(zip(columns, regionDataList))]

Проблема в том, что он дает мне только первые 4 элемента в списке в словаре.

1 Ответ

0 голосов
/ 10 ноября 2018

Вам просто не хватает шага для итерации по списку, чтобы вы могли повторить dict(zip(...)) для каждого куска элементов, соответствующего количеству столбцов (при условии, что вам действительно нужен список диктов - немного отличающийся от ваш пример вывода). Что-то вроде:

cols = ['Id', 'TopSite', 'Floor', 'Room']
items = ['1','ABC','ABC001','ABC002','2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']

results = [dict(zip(cols, items[i:i + len(cols)])) for i in range(0, len(items), len(cols))]

print(results)
# OUTPUT
# [{'Id': '1', 'TopSite': 'ABC', 'Floor': 'ABC001', 'Room': 'ABC002'}, {'Id': '2', 'TopSite': 'ABC', 'Floor': 'ABC001', 'Room': 'ABC003'}, {'Id': '3', 'TopSite': 'DEF', 'Floor': 'DEF001', 'Room': 'DEF001'}]

Конечно, вам действительно не нужен промежуточный шаг, если ваша цель - преобразовать в фрейм данных. Вы можете получить его, передав список столбцов в качестве параметра вместе с сокращенной версией списка элементов. Например:

import pandas as pd

cols = ['Id', 'TopSite', 'Floor', 'Room']
items = ['1','ABC','ABC001','ABC002','2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
chunks = [items[i:i + len(cols)] for i in range(0, len(items), len(cols))]

df = pd.DataFrame(chunks, columns=cols)
print(df)
# OUTPUT
#   Id TopSite   Floor    Room
# 0  1     ABC  ABC001  ABC002
# 1  2     ABC  ABC001  ABC003
# 2  3     DEF  DEF001  DEF001

Кроме того, оба примера будут работать быстрее для больших списков, если вы обрабатываете биты len(...) с переменными, а не запускаете их снова и снова в пределах понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...