将字典的dict转换为pandas DataFrame

时间:2018-05-16 16:03:04

标签: python pandas dictionary dataframe

我有一个两级字典,如下所示:

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 - 这很好,所以我可以在数据框上轻松完成操作

数据帧:

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)中的字典创建pandas数据帧

但是,我发现这种方法在字典上的循环次数太多而且复制数据的次数多于可能需要的情况下效率低下。

欢迎任何建议。

3 个答案:

答案 0 :(得分:4)

删除您的伪代码(对不起!),因为大熊猫退回了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')来电。

答案 1 :(得分:1)

使用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

答案 2 :(得分:0)

从缩放器的字典(玩家和姓名)和展开列表的字典(计数、平均值)创建一个数据框。

pd.DataFrame({'Player':players,'Name':names, **counts, **means})