2017-09-15 1 views
0

habe ich eine Liste wie unten:Python-Liste Gruppe nach Datum, Name

list=[['BMW Z4', 'TEST', 18, '2016-09-26'], 
['BMW Z4', 'TEST', 144, '2014-10-30'], 
['BMW 335i', 'TEST', 144, '2013-09-26'], 
['BMW 335i', 'TEST', 360, '2014-08-31'], 
['BMW 335i', 'TEST', 360, '2017-08-31'], 
['BMW 550xd', 'TEST', 18, '2016-10-30'], 
['BMW 550xd', 'TEST', 36, '2014-10-30']] 

Ich versuche erstellen:

list2=[['BMW Z4', 'TEST', 162, '2016-09-26','2014-10-30'], 
['BMW 335i', 'TEST', 864, '2017-08-31','2013-09-26'], 
['BMW 550xd', 'TEST', 54, '2016-10-30','2014-10-30']] 
  • 1) Liste durch das erste Element gruppiert
  • 2) Menge ist Summe (drittes Element)
  • 3) Neue Spalte wird hinzugefügt Element ist Newts Datum und die fünfte ist die älteste .

Haben Sie irgendwelche Vorschläge, wie ich Tabelle wie list2 mit Python-Funktionen erhalten kann?

+2

Welchen Zweck hat der Wert 'TEST'? – floatingpurr

Antwort

2

können Sie itertools.groupby() verwenden:

from itertools import groupby 

lst = [['BMW Z4', 'TEST', 18, '2016-09-26'], 
     ['BMW Z4', 'TEST', 144, '2014-10-30'], 
     ['BMW 335i', 'TEST', 144, '2013-09-26'], 
     ['BMW 335i', 'TEST', 360, '2014-08-31'], 
     ['BMW 335i', 'TEST', 360, '2017-08-31'], 
     ['BMW 550xd', 'TEST', 18, '2016-10-30'], 
     ['BMW 550xd', 'TEST', 36, '2014-10-30']] 

lst2 = [] 

for k, g in groupby(lst, lambda x: x[0]): 
    g = list(g) 
    lst2.append([k, "TEST", sum(x[2] for x in g), max(x[3] for x in g), 
       min(x[3] for x in g)]) 
print(lst2) 

Ausgang:

[['BMW Z4', 'TEST', 162, '2016-09-26', '2014-10-30'], 
['BMW 335i', 'TEST', 864, '2017-08-31', '2013-09-26'], 
['BMW 550xd', 'TEST', 54, '2016-10-30', '2014-10-30']] 
2

Sie könnten Pandas verwenden diese

import pandas as pd 

list1=[['BMW Z4', 'TEST', 18, '2016-09-26'], 
     ['BMW Z4', 'TEST', 144, '2014-10-30'], 
     ['BMW 335i', 'TEST', 144, '2013-09-26'], 
     ['BMW 335i', 'TEST', 360, '2014-08-31'], 
     ['BMW 335i', 'TEST', 360, '2017-08-31'], 
     ['BMW 550xd', 'TEST', 18, '2016-10-30'], 
     ['BMW 550xd', 'TEST', 36, '2014-10-30']] 

result = pd.DataFrame(list1).groupby(0, as_index=False).agg({1:'first', 2:'sum', 3:['max', 'min']}).values 

print(result) 

zu tun, was werden Sie geben:

[['BMW 335i' 'TEST' 864 '2017-08-31' '2013-09-26'] 
['BMW 550xd' 'TEST' 54 '2016-10-30' '2014-10-30'] 
['BMW Z4' 'TEST' 162 '2016-09-26' '2014-10-30']] 

(beachten Sie sollten nicht Ihre Variable 'list' nennen, da dies die in Art gebaut hat Vorrang)

+0

Um zu vermeiden, dass der Index zurückgesetzt werden muss, können Sie einfach 'as_index = False' an' groupby' übergeben. – miradulo

+1

@Mitch danke, ich vergesse immer diese Option, habe diese Änderung vorgenommen –

1

Sie auch pandas

import pandas as pd 
import numpy as np 

df = pd.DataFrame(l) 

      0  1 2   3 
0  BMW Z4 TEST 18 2016-09-26 
1  BMW Z4 TEST 144 2014-10-30 
2 BMW 335i TEST 144 2013-09-26 
3 BMW 335i TEST 360 2014-08-31 
4 BMW 335i TEST 360 2017-08-31 
5 BMW 550xd TEST 18 2016-10-30 
6 BMW 550xd TEST 36 2014-10-30 


l2 = df.groupby(0).agg({1: 'first', 2:np.sum, 3: [np.max, np.min]}).reset_index().values.tolist() 

l2 

[['BMW 335i', 'TEST', 864, '2017-08-31', '2013-09-26'], 
['BMW 550xd', 'TEST', 54, '2016-10-30', '2014-10-30'], 
['BMW Z4', 'TEST', 162, '2016-09-26', '2014-10-30']] 

auch nutzen können, rufen Sie nicht Ihre Listen, list

1

können Sie defaultdict verwenden:

from collections import defaultdict 

data = [ 
    ['BMW Z4', 'TEST', 18, '2016-09-26'], 
    ['BMW Z4', 'TEST', 144, '2014-10-30'], 
    ['BMW 335i', 'TEST', 144, '2013-09-26'], 
    ['BMW 335i', 'TEST', 360, '2014-08-31'], 
    ['BMW 335i', 'TEST', 360, '2017-08-31'], 
    ['BMW 550xd', 'TEST', 18, '2016-10-30'], 
    ['BMW 550xd', 'TEST', 36, '2014-10-30'], 
] 

d = defaultdict(lambda: {'sum': 0, 'dates': set()}) 
for row in data: 
    d[row[0]]['sum'] += row[2] 
    d[row[0]]['dates'].add(row[3]) 

result = [ 
    [key, 'TEST', value['sum']] + sorted(value['dates'], reverse=True) 
    for key, value in d.items() 
] 

Btw, ist es nicht gehen od zu verwenden list als Name einer Variablen.