2016-12-22 6 views
1

Ich habe einen Pandas genannt Datenrahmen past_trend, die wie dieserconvert Pandas Datenrahmen Zum Wörterbuch

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 

und ich versuche zu wandeln diese in ein Wörterbuch sieht das ungefähr so ​​der

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

sieht Das Datumsformat muss nicht starr sein wie das oben gezeigte, es könnte auch so sein. Die Sache ist, wenn ich die to_dict Funktion verwenden ich eine Ausgabe erhalten, die wie folgt

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

sieht so ich die Gruppentypen umgewandelt (stöhnen, Dank) in eine Liste und ich versuche, über das zu durchlaufen. Ich bin soweit gekommen, wie unten gezeigt.

#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 

aber im einen Fehler bekommen

TypeError: unhashable type: 'list' 

Antwort

1

Dies sollte es tun

{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

danke pirsquared, es hat perfekt funktioniert .. –

1

Hier ist auf dem Weg.

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

Angenommen, Sie mit Ihrem Datenrahmen beginnen:

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 

Die einfachste Sache to_dict verwenden zu tun wäre, um den Index zu 'created' dann einzustellen:

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

Wenn Sie nicht über ein dict von dicts möchten, können Sie immer in etwa wie folgt tun:

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

Und wenn Sie darauf bestehen, Strings anstelle von Timestamp-Objekte (einen schlechten Ruf IMO) mit:

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

Vielen Dank juanpa. aber es brauchte es wirklich als ein Wörterbuch von Listen, weil das Frontend des Dashboards es in diesem Format akzeptieren musste. –

Verwandte Themen