2016-12-29 4 views
1

У меня есть документ CSV, в котором есть столбец, где каждая ячейка содержит список dicts. Любые советы о том, как извлечь эти данные, сохраняя их в виде списков диктонов, будут оценены по достоинству. Я пробовал обычные json/pandas/csv read-ins, и никто из них, похоже, не работает должным образом (преобразует в строки/unicode, что неудивительно, но все еще расстраивает). В конечном счете, я хотел бы, чтобы на выходе был блок данных, где строка заголовка - это ключи, а каждая следующая строка - это данные.Список Dicts в CSV

Пример Раздел CSV:

1 results 

2 [{"y": 47, "type": "square"}, {"type": "square", "b": 49}, {"type": "square", "z": 29}, {"a": 69, "type": "square"}, {"type": "square", "x": 81}] 

3 [{"type": "circle", "b": 90}, {"y": 12, "type": "circle"}, {"a": 78, "type": "circle"}, {"type": "circle", "c": 74}, {"type": "circle", "x": 14}, {"type": "circle", "z": 19}] 

4 [{"type": "square", "b": 85}, {"type": "square", "x": 73}, {"type": "square", "c": 50}] 

5 [{"type": "triangle", "c": 71}, {"type": "triangle", "z": 66}, {"type": "triangle", "x": 16}, {"type": "triangle", "b": 38}, {"y": 67, "type": "triangle"}, {"a": 80, "type": "triangle"}] 

Пример вывода:

type  a b c x y z 
0 square 69 49 NaN 81 47 29 
1 circle 78 90 74 14 12 19 
2 square NaN 85 50 73 NaN NaN 
3 triangle 80 38 71 16 67 66 
+0

Когда у вас есть строка, как 'ы =«[{ 'а': 5 ' b ': 3}, {' apple ':' banana '}] "', вы можете использовать 'l = ast.literal_eval (s)' и 'l' будет список словарей –

+0

Возможно, вы захотите получить образец выход ... трудно понять, что вы пытаетесь разобрать –

+0

Поместите кусочек своего CSV, например. –

ответ

2

Оценивая каждую строку в файл и делать некоторые словарную работу получает вам желаемый результат:

with open(filename) as fobj: 
    next(fobj) # skip first line with word `results` 
    data = [eval(line) for line in fobj if line.strip()] 
res = [] 
for entry in data: 
    d = entry[0].copy() 
    for x in entry[1:]: 
     d.update(x) 
    res.append(d) 
df = pd.DataFrame(res) 
df.reindex_axis(['type', 'a', 'b', 'c', 'x', 'y', 'z'], axis=1) 
df 

enter image description here

Если вы не хотите писать текст на этой линии. Вы можете удалить все из СТОРОНА []:

eval('[' + line.split('[')[-1].split(']')[0] + ']') 

В качестве альтернативы, вы можете использовать регулярное выражение:

import re 

eval(re.findall(r'\[.*?\]', line)[0]) 
+0

спасибо Майк! это выглядит потрясающе, но когда я пытаюсь запустить ваш код, я получаю синтаксическую ошибку «Файл» », строка 1 « [{"" type "": "" circle "", "b" ": 90}, {"" y "": 12, "type" ":" circle ""}, {"" a "": 78, "type" ":" circle ""}, {"" type "" : "" круг "", "c" ": 74}, {" "type" ":" "circle" "," x "": 14}, {"" type "": "circle" , "z" ": 19}]" ,,,,,, ^ SyntaxError: недействительный синтаксис – shibby

+0

Похоже, в конце вашей строки есть куча дополнительных запятых: '19}]" ,,, ,,, '. Вам нужно удалить первый. –

+0

Добавил строку к моему ответу, которая должна очистить запятые. –

Смежные вопросы