2017-10-05 4 views
1

Ich versuche, ein Wörterbuch schnell aus Gruppen von Werten zu machen, wobei jedes Element im Wörterbuch ein Schlüsselwertpaar von zwei anderen Spalten hat, die diesem Wert zugeordnet sind. Zum Beispiel:Pandas - Erstellen Sie ein Wörterbuch aus Spalten und Zeilengruppen schnell

Meine Daten:

    cheese    x    y 
1 0000000000000005559    1    2 
2 0000000000000005559    2    2 
3 0000000000000004058    3    5 
4 0000000000000004058    4    5 
5 0000000000000004058    5    5 

gewünschte Ausgabe:

cheese 
0000000000000005559    {1: 2, 2: 2} 
0000000000000004058  {3: 5, 4: 5, 5: 5} 
0000000000000007157    {6: 7, 7: 7} 
0000000000000000815 {8: 10, 9: 10, 10: 10} 
0000000000000009160   {11: 12, 12: 12} 

Ich kann dies tun mit einem zu komplizierten lambda und apply aber das ist wirklich langsam mit größerem Datenrahmen (Größenordnung von Millionen von einzigartigen Gruppierungen). Wie kann ich das schnell erreichen?

Antwort

4

A Art und Weise mit defaultdict
Dies sollte ziemlich schnell sein

from collections import defaultdict 

d = defaultdict(dict) 

es = df.epoch.values.tolist() 
xs = df.x.values.tolist() 
ys = df.y.values.tolist() 

for e, x, y in zip(es, xs, ys): 
    d[e][x] = y 

pd.Series(d) 

1505339100449045559   {1: 2, 2: 2} 
1505339102148504058 {3: 5, 4: 5, 5: 5} 
dtype: object 
+0

Diese sind schnell. Sir Sie können Zeiten hinzufügen – Dark

+0

Ich habe es getestet und bekam (in Sekunden): 'Out [84]: 6.7047929763793945' – guy

1

Verwenden

In [1544]: df.groupby('epoch').apply(lambda x: dict(x[['x', 'y']].values)) 
Out[1544]: 
epoch 
1505339100449045559   {1: 2, 2: 2} 
1505339102148504058 {3: 5, 4: 5, 5: 5} 
dtype: object 

gleiche wie df.groupby('epoch')[['x', 'y']].apply(lambda x: dict(x.values))

und Bharathdf.groupby('epoch').apply(lambda x: dict(zip(x['x'], x['y'])))


Timings

In [1585]: ndf = pd.concat([df]*1000, ignore_index=True) 

In [1587]: %timeit ndf.groupby('epoch').apply(lambda x: dict(zip(x['x'], x['y']))) 
100 loops, best of 3: 3.65 ms per loop 

In [1586]: %timeit ndf.groupby('epoch')[['x', 'y']].apply(lambda x: dict(x.values)) 
100 loops, best of 3: 14.9 ms per loop 

In [1588]: %timeit ndf.groupby('epoch').apply(lambda x: dict(x[['x', 'y']].values)) 
100 loops, best of 3: 15.3 ms per loop 
+0

Diese im Grunde, was ich hatte, und ist wirklich nicht schnell. Ich tippe es in einer Sekunde und poste die Ergebnisse. – guy

Verwandte Themen