Распаковка вложенного словаря в панду DataFrame - PullRequest
0 голосов
/ 04 февраля 2019

Мой словарь в настоящее время настроен следующим образом:

{'0001': {'Batting Hours': [79, 154, 50, 172],
  'Bowling Hours': [101, 82, 298],
  'Date': ['02/02/2019', '02/01/2019', '02/04/2019', '02/03/2019']},
 '0002': {'Batting Hours': [7, 23, 40],
  'Bowling Hours': [14, 30, 43],
  'Date': ['02/04/2019', '02/01/2019', '02/02/2019']}}

Как развернуть этот словарь, чтобы в кадре данных был такой вывод:

Code        Date              Batting Hours     Bowling Hours 
0001        02/02/2019                79                   101            
0001        02/01/2019                154                   82 

Я попытался просмотреть документациюо том, как развернуты другие подобные структуры данных, но я не могу разобраться с моим.

В настоящее время я добавляю значения в список, подобный этому

player_agg_hours_dict[Player]['Batting Hours'].append(aggregate_batting_hours)

Япытаюсь вывести на фрейм данных вот так:

output_df = pd.DataFrame.from_dict(player_agg_hours_dict, orient='index').transpose() # convert dict to dataframe

и я знаю, что параметры from_dict() должны быть другими.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать pd.concat с выражением генератора.Предполагается, что входной словарь dct и ваши списки для любого заданного Code имеют одинаковую длину.

df = pd.concat((pd.DataFrame({**{'Code': key}, **value}) \
                for key, value in dct.items()), ignore_index=True)

print(df)

   Batting Hours  Bowling Hours  Code        Date
0             79            101  0001  02/02/2019
1            154             82  0001  02/01/2019
2             50            298  0001  02/04/2019
3            172            100  0001  02/03/2019
4              7             14  0002  02/04/2019
5             23             30  0002  02/01/2019
6             40             43  0002  02/02/2019
0 голосов
/ 04 февраля 2019

Одним из способов является использование комбинации stack и unstack:

v = pd.DataFrame(dct).stack()

(pd.DataFrame(v.tolist(), index=v.index)
   .stack()
   .unstack(0)
   .reset_index(level=1, drop=True)
   .rename_axis('Code')
   .reset_index())

   Code Batting Hours Bowling Hours        Date
0  0001            79           101  02/02/2019
1  0001           154            82  02/01/2019
2  0001            50           298  02/04/2019
3  0001           172           NaN  02/03/2019
4  0002             7            14  02/04/2019
5  0002            23            30  02/01/2019
6  0002            40            43  02/02/2019

Вы также можете сделать это за один шаг, начав с concat:

(pd.concat({k: pd.DataFrame.from_dict(v, orient='index') for k,v in dct.items()})
   .stack()
   .unstack(1)
   .reset_index(level=1, drop=True)
   .rename_axis('Code')
   .reset_index())

   Code        Date Batting Hours Bowling Hours
0  0001  02/02/2019            79           101
1  0001  02/01/2019           154            82
2  0001  02/04/2019            50           298
3  0001  02/03/2019           172           NaN
4  0002  02/04/2019             7            14
5  0002  02/01/2019            23            30
6  0002  02/02/2019            40            43
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...