将字典中的字典转换为 pandas DataFrame

5

我有一个两层字典,看起来像这样:

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'

I.e.,

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)使用第二步中的字典来创建 pandas 数据帧。
然而,我发现这种方法存在一些低效之处,涉及太多对字典的循环和可能不必要的数据复制。
欢迎任何建议。
3个回答

8

抛弃你的伪代码(抱歉!),因为pandas提供了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

难点在于找出正确的方向来传递......这需要经验。

快速说明,如果您想要使用名称“Date”标记索引,则可以在最后添加.rename_axis('Date')调用。


4
请注意,orient='columns' 是默认设置,因此有时您甚至不需要猜测! - jpp

1

使用 pd.Series (注:我建议使用 cold 提供的 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

从标量字典(players和names)创建一个数据框,并通过展开列表字典(counts,means)来创建数据框。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接