Python 将数据帧转换为字典
我有一个名为past_trend的熊猫数据框,看起来像这样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
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)]}
如果您坚持使用字符串而不是时间戳对象(这是一个错误的调用):
谢谢你,胡安帕。但确实需要它作为列表字典,因为仪表板前端需要接受这种格式。。