2016-12-22 3 views
1

У меня есть панда dataframe по имени past_trend, который выглядит как этотновообращенного панды dataframe в словарь

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] 
    ]} 

в формат даты не должен быть жестко подобным показанному выше, он может быть таким же, как и. Дело в том, когда я использую функцию to_dict я получаю выход, который выглядит следующим образом

{'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}} 

поэтому я преобразовал типы групп (стонать, спасибо) в список и пытаюсь итерация по этому поводу. Я получил это далеко, как показано ниже.

#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' 

ответ

1

Это должно сделать

{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]]} 
+0

спасибо piRsquared, он отлично работал .. –

1

Вот на пути.

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]]} 
0

Предположим, вы начинаете с dataframe:

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' затем использовать to_dict:

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}} 

Если вы не хотите Dict из dicts, вы всегда можете сделать что-то вроде следующего:

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)]} 

И если вы настаиваете на использовании строк вместо объектов Timestamp (плохой вызов IMO):

In [13]: {k:[(str(t),e) for t,e in v] for k,v in d.items()} 
Out[13]: 
{'moans': [('2016-12-16 00:00:00', 0), 
    ('2016-12-17 00:00:00', 0), 
    ('2016-12-18 00:00:00', 0), 
    ('2016-12-19 00:00:00', 0), 
    ('2016-12-20 00:00:00', 6), 
    ('2016-12-21 00:00:00', 0), 
    ('2016-12-22 00:00:00', 0)], 
'thanks': [('2016-12-16 00:00:00', 0), 
    ('2016-12-17 00:00:00', 0), 
    ('2016-12-18 00:00:00', 0), 
    ('2016-12-19 00:00:00', 2), 
    ('2016-12-20 00:00:00', 0), 
    ('2016-12-21 00:00:00', 0), 
    ('2016-12-22 00:00:00', 2)]} 
+0

Спасибо большое juanpa. но действительно нуждался в нем в качестве словаря списков, потому что передняя часть приборной панели должна была принять его в этом формате .. –

Смежные вопросы