Преобразование словарей в панды DataFrame - PullRequest
0 голосов
/ 16 мая 2018

У меня есть двухуровневый словарь, который выглядит так:

myDict = {'a':{'2017-01-01':4.1, '2017-01-02':10.8}, 'b':{'2017-01-01':6.2, '2017-01-03':8.5}}

Я бы хотел сохранить это как фрейм данных, который имеет следующий дизайн:

  • Даты, для которых данные существуют в одном столбце, а не в другом столбце, становятся np.nan в кадре данных - это хорошо, потому что тогда я могу использовать функции обратной засыпки, если это необходимо.
  • Объединение всех дат становится индексом, и индекс имеет тип pd.DatetimeIndex - это хорошо, так что я могу легко выполнять операции с временем на фрейме данных

Dataframe:

mydf = pd.DataFrame({'a':[4,10,np.nan],'b':[6.2,np.nan,8.5]}, index=pd.DatetimeIndex(['2017-01-04','2017-01-02','2017-01-03']))
mydf.index.name = 'Date'

т. Е.

mydf
Out[33]: 
               a    b
Date                 
2017-01-04   4.0  6.2
2017-01-02  10.0  NaN
2017-01-03   NaN  8.5

Проблемы, с которыми я сталкиваюсь, заключаются в том, что, конечно, я заранее не знаю, какие даты составляют итоговый индекс (объединение всех дат), и я также не знаю, как лучше всего добавлять данные столбец за столбцом. .

Псевдокод, который я имею в виду:

(1) цикл по всем датам для всех ключей на уровне 1 словаря, затем объединение всех дат. Это становится моим индексом.

(2) Затем создайте новый словарь, который имеет только оригинальные ключи и значения в том же порядке, что и индекс в (1), и np.nan, где никакие значения не могут быть найдены

(3) Используйте словарь в (2) для создания кадра данных для панд

Тем не менее, я вижу некоторые недостатки этого подхода с точки зрения слишком большого количества циклов в словаре и копирования данных чаще, чем это требуется.

Любой совет приветствуется.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

С pd.Series (PS: я рекомендую использовать from_dict, предоставленный холодным)

pd.Series(myDict).apply(pd.Series).T
Out[615]: 
               a    b
2017-01-01   4.1  6.2
2017-01-02  10.8  NaN
2017-01-03   NaN  8.5
0 голосов
/ 16 мая 2018

Отбросьте свой псевдокод (извините!), Потому что панды получили вашу спину с pd.DataFrame.from_dict.

pd.DataFrame.from_dict(myDict, orient='columns')

               a    b
2017-01-01   4.1  6.2
2017-01-02  10.8  NaN
2017-01-03   NaN  8.5

Хитрость заключается в определении правильного ориентира для прохождения ... который приходит с опытом.

Быстрая заметка, вы можете добавить .rename_axis('Date') вызов в конце, если хотите пометить индекс именем «Дата».

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