Python 将数据帧转换为字典

Python 将数据帧转换为字典,python,pandas,dictionary,Python,Pandas,Dictionary,我有一个名为past_trend的熊猫数据框,看起来像这样 created moans thanks 0 2016-12-16 0 0 1 2016-12-17 0 0 2 2016-12-18 0 0 3 2016-12-19 0 2 4 2016-12-20 6 0 5 2016-12-21 0 0 6 2016-12-22 0 2

我有一个名为past_trend的熊猫数据框,看起来像这样

   created       moans  thanks
0  2016-12-16     0      0
1  2016-12-17     0      0
2  2016-12-18     0      0
3  2016-12-19     0      2
4  2016-12-20     6      0
5  2016-12-21     0      0
6  2016-12-22     0      2
{"moans": [
        ["16 Dec", 0],
        ["17 Dec", 0],
        ["18 Dec", 0],
        ["19 Dec", 2],
        ["20 Dec", 0],
        ["21 Dec", 0],
        ["22 Dec", 2]
    ],
    "thanks": [
        ["16 Dec", 0],
        ["17 Dec", 0],
        ["18 Dec", 0],
        ["19 Dec", 0],
        ["20 Dec", 6],
        ["21 Dec", 0],
        ["22 Dec", 0]
    ]}
{'created': {0: Timestamp('2016-12-16 00:00:00'),
1: Timestamp('2016-12-17 00:00:00'),
2: Timestamp('2016-12-18 00:00:00'),
3: Timestamp('2016-12-19 00:00:00'),
4: Timestamp('2016-12-20 00:00:00'),
5: Timestamp('2016-12-21 00:00:00'),
6: Timestamp('2016-12-22 00:00:00')},
'moans': {0: 0, 1: 0, 2: 0, 3: 0, 4: 6, 5: 0, 6: 0},
'thanks': {0: 0, 1: 0, 2: 0, 3: 2, 4: 0, 5: 0, 6: 2}}
我正试着把它转换成一本类似这样的字典

   created       moans  thanks
0  2016-12-16     0      0
1  2016-12-17     0      0
2  2016-12-18     0      0
3  2016-12-19     0      2
4  2016-12-20     6      0
5  2016-12-21     0      0
6  2016-12-22     0      2
{"moans": [
        ["16 Dec", 0],
        ["17 Dec", 0],
        ["18 Dec", 0],
        ["19 Dec", 2],
        ["20 Dec", 0],
        ["21 Dec", 0],
        ["22 Dec", 2]
    ],
    "thanks": [
        ["16 Dec", 0],
        ["17 Dec", 0],
        ["18 Dec", 0],
        ["19 Dec", 0],
        ["20 Dec", 6],
        ["21 Dec", 0],
        ["22 Dec", 0]
    ]}
{'created': {0: Timestamp('2016-12-16 00:00:00'),
1: Timestamp('2016-12-17 00:00:00'),
2: Timestamp('2016-12-18 00:00:00'),
3: Timestamp('2016-12-19 00:00:00'),
4: Timestamp('2016-12-20 00:00:00'),
5: Timestamp('2016-12-21 00:00:00'),
6: Timestamp('2016-12-22 00:00:00')},
'moans': {0: 0, 1: 0, 2: 0, 3: 0, 4: 6, 5: 0, 6: 0},
'thanks': {0: 0, 1: 0, 2: 0, 3: 2, 4: 0, 5: 0, 6: 2}}
日期格式不必像上面所示那样严格,也可以是原样。问题是,当我使用to_dict函数时,我得到的输出如下所示

   created       moans  thanks
0  2016-12-16     0      0
1  2016-12-17     0      0
2  2016-12-18     0      0
3  2016-12-19     0      2
4  2016-12-20     6      0
5  2016-12-21     0      0
6  2016-12-22     0      2
{"moans": [
        ["16 Dec", 0],
        ["17 Dec", 0],
        ["18 Dec", 0],
        ["19 Dec", 2],
        ["20 Dec", 0],
        ["21 Dec", 0],
        ["22 Dec", 2]
    ],
    "thanks": [
        ["16 Dec", 0],
        ["17 Dec", 0],
        ["18 Dec", 0],
        ["19 Dec", 0],
        ["20 Dec", 6],
        ["21 Dec", 0],
        ["22 Dec", 0]
    ]}
{'created': {0: Timestamp('2016-12-16 00:00:00'),
1: Timestamp('2016-12-17 00:00:00'),
2: Timestamp('2016-12-18 00:00:00'),
3: Timestamp('2016-12-19 00:00:00'),
4: Timestamp('2016-12-20 00:00:00'),
5: Timestamp('2016-12-21 00:00:00'),
6: Timestamp('2016-12-22 00:00:00')},
'moans': {0: 0, 1: 0, 2: 0, 3: 0, 4: 6, 5: 0, 6: 0},
'thanks': {0: 0, 1: 0, 2: 0, 3: 2, 4: 0, 5: 0, 6: 2}}
因此,我将组类型(moan,谢谢)转换为一个列表,并尝试对其进行迭代。我已经做到了这一点,如下所示

#now create the result we want
result = {}
group_types = ['moans', 'thanks']
for group in group_types:
    result[group]={[past_trend['created'],past_trend[group]]}
result
但是我犯了一个错误

TypeError: unhashable type: 'list'
在路上

In [99]: {k: [[x, y] for x, y in v.items()] 
            for k, v in df.set_index('created').to_dict().iteritems()}
Out[99]:
{'moans': [['2016-12-22', 0],
  ['2016-12-20', 6],
  ['2016-12-21', 0],
  ['2016-12-19', 0],
  ['2016-12-18', 0],
  ['2016-12-17', 0],
  ['2016-12-16', 0]],
 'thanks': [['2016-12-22', 2],
  ['2016-12-20', 0],
  ['2016-12-21', 0],
  ['2016-12-19', 2],
  ['2016-12-18', 0],
  ['2016-12-17', 0],
  ['2016-12-16', 0]]}
这应该可以

{k: [[i.strftime('%d %b'), v] for i, v in s.iteritems()]
 for k, s in df.set_index('created').iteritems()}

{'moans': [['16 Dec', 0],
  ['17 Dec', 0],
  ['18 Dec', 0],
  ['19 Dec', 0],
  ['20 Dec', 6],
  ['21 Dec', 0],
  ['22 Dec', 0]],
 'thanks': [['16 Dec', 0],
  ['17 Dec', 0],
  ['18 Dec', 0],
  ['19 Dec', 2],
  ['20 Dec', 0],
  ['21 Dec', 0],
  ['22 Dec', 2]]}

假设从数据帧开始:

In [5]: df
Out[5]: 
     created  moans  thanks
0 2016-12-16      0       0
1 2016-12-17      0       0
2 2016-12-18      0       0
3 2016-12-19      0       2
4 2016-12-20      6       0
5 2016-12-21      0       0
6 2016-12-22      0       2
最简单的方法是将索引设置为
'created'
,然后使用
进行编辑:

In [8]: d = df.set_index('created').to_dict()

In [9]: d
   Out[9]: 
   {'moans': {Timestamp('2016-12-16 00:00:00'): 0,
     Timestamp('2016-12-17 00:00:00'): 0,
     Timestamp('2016-12-18 00:00:00'): 0,
     Timestamp('2016-12-19 00:00:00'): 0,
     Timestamp('2016-12-20 00:00:00'): 6,
     Timestamp('2016-12-21 00:00:00'): 0,
     Timestamp('2016-12-22 00:00:00'): 0},
    'thanks': {Timestamp('2016-12-16 00:00:00'): 0,
     Timestamp('2016-12-17 00:00:00'): 0,
     Timestamp('2016-12-18 00:00:00'): 0,
     Timestamp('2016-12-19 00:00:00'): 2,
     Timestamp('2016-12-20 00:00:00'): 0,
     Timestamp('2016-12-21 00:00:00'): 0,
     Timestamp('2016-12-22 00:00:00'): 2}}
如果你不想要一份口述,你可以做如下的事情:

In [11]: d = {k:sorted(v.items()) for k,v in d.items()}

In [12]: d
Out[12]: 
{'moans': [(Timestamp('2016-12-16 00:00:00'), 0),
  (Timestamp('2016-12-17 00:00:00'), 0),
  (Timestamp('2016-12-18 00:00:00'), 0),
  (Timestamp('2016-12-19 00:00:00'), 0),
  (Timestamp('2016-12-20 00:00:00'), 6),
  (Timestamp('2016-12-21 00:00:00'), 0),
  (Timestamp('2016-12-22 00:00:00'), 0)],
 'thanks': [(Timestamp('2016-12-16 00:00:00'), 0),
  (Timestamp('2016-12-17 00:00:00'), 0),
  (Timestamp('2016-12-18 00:00:00'), 0),
  (Timestamp('2016-12-19 00:00:00'), 2),
  (Timestamp('2016-12-20 00:00:00'), 0),
  (Timestamp('2016-12-21 00:00:00'), 0),
  (Timestamp('2016-12-22 00:00:00'), 2)]}
如果您坚持使用字符串而不是时间戳对象(这是一个错误的调用):


谢谢你,胡安帕。但确实需要它作为列表字典,因为仪表板前端需要接受这种格式。。