将Python字典转换为数据框
我有一个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}
键是Unicodedate,值是整数。 我想通过将date和相应的值作为两个单独的列将其转换为pandas数据框。 例如:col1:datecol2:DateValue(date仍然是Unicode和date值仍然是整数)
Date DateValue 0 2012-07-01 391 1 2012-07-02 392 2 2012-07-03 392 . 2012-07-04 392 . ... ... . ... ...
任何帮助在这个方向将不胜感激。 我无法find有关pandas文档的资源来帮助我。
我知道一个解决scheme可能是将这个字典中的每个键 – 值对转换成一个字典,以便整个结构成为字典的字典,然后我们可以将每一行分别添加到数据框中。 但我想知道是否有更简单的方法和更直接的方法来做到这一点。
到目前为止,我已经尝试将字典转换为一个系列对象,但这似乎并没有维持列之间的关系:
s = Series(my_dict,index=my_dict.keys())
这里的错误,是因为调用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
但我认为通过串联构造函数更有意义:
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
正如在另一个使用pandas.DataFrame()
直接解释的答案在这里不会按照你的想法行事。
你可以做的是使用orient='index'
pandas.DataFrame.from_dict
:
In[7]: pandas.DataFrame.from_dict({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}, orient='index') Out[7]: 0 2012-06-13 389 2012-06-16 389 2012-06-12 389 2012-07-03 392 2012-07-02 392 2012-06-29 391 2012-06-30 391 2012-07-01 391 2012-06-15 389 2012-06-08 388 2012-06-09 388 2012-07-05 392 2012-07-04 392 2012-06-14 389 2012-07-06 392 2012-06-17 389 2012-06-20 390 2012-06-21 390 2012-06-22 390 2012-06-23 390 2012-06-11 389 2012-06-10 388 2012-06-26 391 2012-06-27 391 2012-06-28 391 2012-06-24 390 2012-06-19 390 2012-06-18 390 2012-06-25 391
将字典的项目传递给DataFrame构造函数,并给出列名称。 之后parsingDate
列以获取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': 1, 'key 2': 2, 'key 3': 3} In[33]:pd.DataFrame([new_dict]) Out[33]: key 1 key 2 key 3 0 1 2 3
这帮我省了一些头痛,所以我希望能帮到别人。
pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })
您也可以将字典的键和值传递给新的数据框,如下所示:
import pandas as pd myDict = {<the_dict_from_your_example>] df = pd.DataFrame() df['Date'] = myDict.keys() df['DateValue'] = myDict.values()
接受一个字典作为参数,并返回一个dataframe与字典的键作为索引和值作为列。
def dict_to_df(d): df=pd.DataFrame(d.items()) df.set_index(0, inplace=True) return df
在我的情况下,我想要一个字典的键和值是DataFrame的列和值。 所以唯一对我有用的是:
data = {'adjust_power': 'y', 'af_policy_r_submix_prio_adjust': '[null]', 'af_rf_info': '[null]', 'bat_ac': '3500', 'bat_capacity': '75'}
columns=list(data.keys()) values = list(data.values()) arr_len = len(values)
pd.DataFrame(np.array(values, dtype=object).reshape(1, arr_len), columns=columns)
我已经遇到了几次,并有一个从函数get_max_Path()
创build的示例字典,并返回示例字典:
{2: 0.3097502930247044, 3: 0.4413177909384636, 4: 0.5197224051562838, 5: 0.5717654946470984, 6: 0.6063959031223476, 7: 0.6365209824708223, 8: 0.655918861281035, 9: 0.680844386645206}
为了将其转换为数据框,我运行了以下命令:
df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()
用一个单独的索引返回一个简单的两列数据框:
index 0 0 2 0.309750 1 3 0.441318
只需使用f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)
重命名列f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)