2017-05-29 3 views
-1

So habe ich eine Liste wie folgt aus:Konvertieren Liste aggregierte Liste

date, type 
29-5-2017, x 
30-5-2017, x 
31-5-2017, y 
1-6-2017, z 
2-6-2017, z 
3-6-2017, y 
28-5-2017, y 
29-5-2017, z 
30-5-2017, z 
31-5-2017, y 
1-6-2017, z 
2-6-2017, z 
3-6-2017, x 
29-5-2017, x 
30-5-2017, z 
31-5-2017, z 
1-6-2017, y 
2-6-2017, x 
3-6-2017, z 
4-6-2017, y 

Wie würde ich eine aggregierte Version dieser Liste zu erstellen? So bekomme ich jedes Datum nur einmal, und sehe wieviele von jedem Typ es an einem bestimmten Datum gibt.

So:

date, no._of_x, no._of_y, no._of_z 
28-5-2017, 0, 1, 0 
29-5-2017, 2, 0, 1 
30-5-2017, 1, 0, 2 
31-5-2017, 0, 2, 1 
1-6-2017, 0, 1, 2 
2-6-2017, 1, 0, 2 
3-6-2017, 1, 1, 1 
4-6-2017, 0, 1, 0 
+2

Und Deine Frage ist? Was ist das Problem, das du hast, was hast du versucht, das hat nicht funktioniert? –

+1

Sie können fast alles tun, wenn Sie es tun/versuchen, es zu tun, nicht –

+0

@KevinSijbers zu fragen, wie man eine Liste wie oben gesehen in eine viel kürzere Liste wie die darunter konvertieren. Irgendwann würde ich gerne ein Balkendiagramm erstellen, so dass ich an jedem Tag sehen kann, wie viel von x, y, z es gibt. –

Antwort

0

Unter der Annahme, dass die Liste eine Liste von Listen mit jedem sublist ist ein Datum Zeichenfolge enthält und von der x, y oder z, können Sie Ihre Liste erste Gruppe von Terminen. Erstellen Sie einfach ein Wörterbuch, oder collections.defaultdict, Mapping Termine zu Listen von x/z/y.

dates = collections.defaultdict(list) 
for date, xyz in data: 
    dates[date].append(xyz) 

Als nächstes Sie ein anderes Wörterbuch erstellen können, die jeweils die Abbildung dieser x/y/z-Listen zu einem Counter dict:

counts = {date: collections.Counter(xyz) for date, xyz in dates.items()} 

Danach counts ist dies:

{'2-6-2017,': Counter({'z': 2, 'x': 1}), 
'29-5-2017,': Counter({'x': 2, 'z': 1}), 
'3-6-2017,': Counter({'x': 1, 'y': 1, 'z': 1}), 
'28-5-2017,': Counter({'y': 1}), 
'1-6-2017,': Counter({'z': 2, 'y': 1}), 
'4-6-2017,': Counter({'y': 1}), 
'31-5-2017,': Counter({'y': 2, 'z': 1}), 
'30-5-2017,': Counter({'z': 2, 'x': 1})} 
+0

Großartig! Vielen Dank. Gibt es auch eine Möglichkeit, dies zu formatieren? Es ist also immer x, dann y, dann z. Und notiere eine 0, wenn es kein x, y oder z gibt. Gefällt mir: '1-6-2017,': Counter ({'x': 0, 'y': 1, 'z': 2}), '4-6-2017,': Zähler ({'x': 0, 'y': 1, 'z': 0}), Entschuldigung für all diese Fragen, ich bin ein Python sehr neu. –