2015-11-14 3 views
1

Я пытаюсь создать кадр данных в Python с Pandas, который включает вложенные словари и списки списков. Я просмотрел другие вопросы о преобразовании вложенных словарей, но я не смог найти достаточного ответа.Преобразование списка, вложенного под два словаря в DataFrame

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

activity_dict = { 

'lesson1' : { 'january' : [['Todd', 'Running', 30],['Christy', 'Studying', 25],['Alex','Soccer', 10]], 
       'february' : [['Jim', 'Bobsledding', 5],['Frank', 'Jogging',8]]}, 

'lesson2' : {'february' : [['Todd', 'Running', 18],['John', 'Studying', 3],['Don','Soccer', 40]], 
       'march' : [['Tom', 'Bobsledding', 10],['Sam', 'Yoga', 42]], 
       'april' : [['Julie', 'Biking', 20],['Chris', 'Baseball', 10]]} 
} 

Я пытаюсь получить вывод, что для деятельности каждого студента, колой = Lesson #, ColB = Месяц, ColC = Студент, Холода = активность, и Cole = Протокол. Пример вывода будет:

Lesson # Month Student Activity Minutes 
Lesson 1 February Jim Bobsledding 5 
Lesson 1 February Frank Jogging 8 
Lesson 2 February Todd Running 18 

Я нашел способ создания dataframe столбцов С через Е, но я не могу включить столбцы А и B.

Мой код прямо сейчас выглядит следующим образом:

import pandas 

activity_log = [] 

for lesson, all_activities in activity_dict.items(): 
    for month, month_activities in all_activities.items(): 
     activity_log.append(pandas.DataFrame(month_activities)) 

Как я могу обновить это, чтобы включить словарные ключи (урок и месяц) в качестве столбцов A и B? Я не уверен, что изменение списка списков в словаре поможет, но я сохранил его как список, поскольку именно так я получил данные.

ответ

3

Используйте list comprehension для преобразования Dict в dicts из списка списков в список списков:

In [99]: [(lesson, month, name, activity, minutes) 
      for lesson, dct in activity_dict.items() 
      for month, vals in dct.items() 
      for name, activity, minutes in vals] 
Out[99]: 
[('lesson2', 'april', 'Julie', 'Biking', 20), 
('lesson2', 'april', 'Chris', 'Baseball', 10), 
('lesson2', 'february', 'Todd', 'Running', 18), 
('lesson2', 'february', 'John', 'Studying', 3), 
('lesson2', 'february', 'Don', 'Soccer', 40), 
('lesson2', 'march', 'Tom', 'Bobsledding', 10), 
('lesson2', 'march', 'Sam', 'Yoga', 42), 
('lesson1', 'january', 'Todd', 'Running', 30), 
('lesson1', 'january', 'Christy', 'Studying', 25), 
('lesson1', 'january', 'Alex', 'Soccer', 10), 
('lesson1', 'february', 'Jim', 'Bobsledding', 5), 
('lesson1', 'february', 'Frank', 'Jogging', 8)] 

Затем использовать pd.DataFrame построить DataFrame из списка списков:

In [98]: pd.DataFrame([(lesson, month, name, activity, minutes) 
         for lesson, dct in activity_dict.items() 
         for month, vals in dct.items() 
         for name, activity, minutes in vals], 
      columns=['Lesson', 'Month', 'Name', 'Activity', 'Minutes']) 
Out[98]: 
    Lesson  Month  Name  Activity Minutes 
0 lesson2  april Julie  Biking  20 
1 lesson2  april Chris  Baseball  10 
2 lesson2 february  Todd  Running  18 
3 lesson2 february  John  Studying  3 
4 lesson2 february  Don  Soccer  40 
5 lesson2  march  Tom Bobsledding  10 
6 lesson2  march  Sam   Yoga  42 
7 lesson1 january  Todd  Running  30 
8 lesson1 january Christy  Studying  25 
9 lesson1 january  Alex  Soccer  10 
10 lesson1 february  Jim Bobsledding  5 
11 lesson1 february Frank  Jogging  8 
+0

Отлично , Попробуйте это сейчас, ответьте как можно скорее! – Venetian

+0

Это работает! Быстрый вопрос, почему импорт pandas как pd настолько распространен? Это просто, что pd намного удобнее? – Venetian

+0

Я думаю, что у него есть два преимущества: он экономит при вводе (если вы ссылаетесь на множество функций или классов Pandas), и это делает код более читаемым. – unutbu

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