Convert Python dict into a dataframe
我有一个类似下面的python字典:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | {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日期,值是整数。我想通过将日期及其对应值作为两个单独的列来将其转换为熊猫数据帧。示例:col1:dates col2:datevalue(日期仍为unicode,日期值仍为整数)
1 2 3 4 5 6 7 | 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对象,但这似乎无法维持列之间的关系:
1 | s = Series(my_dict,index=my_dict.keys()) |
这里的错误是因为使用标量值调用了数据帧构造函数(其中它期望值为list/dict/…)。即有多个列):
1 2 | pd.DataFrame(d) ValueError: If using all scalar values, you must must pass an index |
您可以从字典中获取项(即键值对):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
但我认为传递序列构造函数更有意义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
正如另一个答案所解释的那样,直接在这里使用
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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 |
在将字典转换为pandas数据框时,如果您希望键是所述数据框的列,值是行值,则只需在字典周围加上括号,如下所示:
1 2 3 4 5 6 | 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 |
它让我省去了一些头痛,所以我希望它能帮到外面的人!
将字典的项传递给数据框架构造函数,并给出列名称。然后分析
注意python 2.x和3.x的区别:
在Python 2。
1 2 | df = pd.DataFrame(data.items(), columns=['Date', 'DateValue']) df['Date'] = pd.to_datetime(df['Date']) |
在python 3.x中:(需要一个额外的"list")。
1 2 | df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue']) df['Date'] = pd.to_datetime(df['Date']) |
熊猫有内置功能,可以将听写转换为数据帧。
pd.DataFrame.from_dict(dictionaryObject,orient='index')
对于您的数据,您可以如下转换:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import pandas as pd your_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} your_df_from_dict=pd.DataFrame.from_dict(your_dict,orient='index') print(your_df_from_dict) |
在我的例子中,我希望dict的键和值是数据帧的列和值。所以唯一对我有用的就是:
1 2 3 4 5 6 7 | 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) |
1 | pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() }) |
您还可以将字典的键和值传递给新的数据帧,如下所示:
1 2 3 4 5 6 | import pandas as pd myDict = {<the_dict_from_your_example>] df = pd.DataFrame() df['Date'] = myDict.keys() df['DateValue'] = myDict.values() |
接受dict作为参数,并返回一个数据帧,其中dict的键作为索引,值作为列。
1 2 3 4 | def dict_to_df(d): df=pd.DataFrame(d.items()) df.set_index(0, inplace=True) return df |
这就是我的工作方式:
1 2 | df= pd.DataFrame([d.keys(), d.values()]).T df.columns= ['keys', 'values'] # call them whatever you like |
我希望这有帮助
1 2 | d = {'Date': list(yourDict.keys()),'Date_Values': list(yourDict.values())} df = pandas.DataFrame(data=d) |
如果您没有将
0 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
1 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
2 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
3 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
4 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
但通过添加
0 2012-06-08 388
1 2012-06-09 388
2 2012-06-10 388
3 2012-06-11 389
4 2012-06-12 389
...
我认为在创建字典时,可以对数据格式进行一些更改,然后可以轻松地将其转换为数据帧:
输入:
1 | a={'Dates':['2012-06-08','2012-06-10'],'Date_value':[388,389]} |
输出:
1 | {'Date_value': [388, 389], 'Dates': ['2012-06-08', '2012-06-10']} |
输入:
1 | aframe=DataFrame(a) |
输出:将是您的数据帧
你只需要在一些地方使用一些文本编辑,比如升华或者Excel。
我已经多次遇到这种情况,并且有一个示例字典,它是由函数
3: 0.4413177909384636,
4: 0.5197224051562838,
5: 0.5717654946470984,
6: 0.6063959031223476,
7: 0.6365209824708223,
8: 0.655918861281035,
9: 0.680844386645206}
要将其转换为数据帧,我运行了以下操作:
返回具有单独索引的简单两列数据帧:
0 2 0.309750
1 3 0.441318
只需使用