我有如下的Python字典:
{u'2012-06-08': 388, u'2012-06-09': 388, u'2012-06-10': 388, u'2012-06-11': 389, u'2012-06-12': 389, u'2012-06-13': 389, u'2012-06-14': 389, u'2012-06-15': 389, u'2012-06-16': 389, u'2012-06-17': 389, u'2012-06-18': 390, u'2012-06-19': 390, u'2012-06-20': 390, u'2012-06-21': 390, u'2012-06-22': 390, u'2012-06-23': 390, u'2012-06-24': 390, u'2012-06-25': 391, u'2012-06-26': 391, u'2012-06-27': 391, u'2012-06-28': 391, u'2012-06-29': 391, u'2012-06-30': 391, u'2012-07-01': 391, u'2012-07-02': 392, u'2012-07-03': 392, u'2012-07-04': 392, u'2012-07-05': 392, u'2012-07-06': 392}
键是Unicode日期,值是整数。我想通过将日期及其对应的值作为两个单独的列将其转换为pandas数据框。示例:col1:日期col2:DateValue(日期仍为Unicode,日期值仍为整数)
Date DateValue 0 2012-07-01 391 1 2012-07-02 392 2 2012-07-03 392 . 2012-07-04 392 . ... ... . ... ...
. 对此方向的任何帮助将不胜感激。我找不到有关熊猫文档的资源来帮助我。
我知道一种解决方案可能是将此dict中的每个键值对转换为dict,以便整个结构成为dict的dict,然后我们可以将每一行分别添加到数据帧中。但我想知道是否有更简单的方法和更直接的方法来执行此操作。
到目前为止,我已经尝试将dict转换为series对象,但这似乎并不维护各列之间的关系:
s = Series(my_dict,index=my_dict.keys())
将字典的项目传递给DataFrame构造函数,并指定列名称。之后,解析Date列以获取Timestamp值。
DataFrame
Date
Timestamp
注意python 2.x和3.x之间的区别:
在python 2.x中:
df = pd.DataFrame(data.items(), columns=['Date', 'DateValue']) df['Date'] = pd.to_datetime(df['Date'])
在Python 3.x中:(需要一个附加的“列表”)
df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue']) df['Date'] = pd.to_datetime(df['Date'])
将字典转换为pandas数据框时,你希望键是该数据框的列,而值是行值,则只需在字典周围放置方括号,如下所示:
new_dict = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'} In[33]:pd.DataFrame([new_dict]) Out[33]: key 1 key 2 key 3 0 value 1 value 2 value 3
它免除了我的头疼,所以我希望它可以帮助某个人!
这里的错误是因为用标量值调用DataFrame构造函数(它期望值是列表/字典/ …,即具有多个列):
pd.DataFrame(d) ValueError: If using all scalar values, you must must pass an index
你可以从字典中获取项目(即键值对):
In [11]: pd.DataFrame(d.items()) # or list(d.items()) in python 3 Out[11]: 0 1 0 2012-07-02 392 1 2012-07-06 392 2 2012-06-29 391 3 2012-06-28 391 ... In [12]: pd.DataFrame(d.items(), columns=['Date', 'DateValue']) Out[12]: Date DateValue 0 2012-07-02 392 1 2012-07-06 392 2 2012-06-29 391
但是我认为传递Series构造函数更有意义:
In [21]: s = pd.Series(d, name='DateValue') Out[21]: 2012-06-08 388 2012-06-09 388 2012-06-10 388 In [22]: s.index.name = 'Date' In [23]: s.reset_index() Out[23]: Date DateValue 0 2012-06-08 388 1 2012-06-09 388 2 2012-06-10 388