2016-04-20 11 views
1

Es gibt einen SFrame mit Spalten mit dict Elemente.Python: Iterate eine Operation über verschiedene Spalten einer Zeile für alle Zeilen eines graphlab.SFrame

import graphlab 
import numpy as np 
a = graphlab.SFrame({'col1':[{'oshan':3,'modi':4},{'ravi':1,'kishan':5}], 
        'col2':[{'oshan':1,'rawat':2},{'hari':3,'kishan':4}]}) 

Ich möchte, für jede Zeile des SFrame cosine Abstand zwischen diesen beiden Spalten berechnen. Unten ist die Operation mit for loop.

dis = np.zeros(len(a),dtype = float) 
for i in range(len(a)): 
    dis[i] = graphlab.distances.cosine(a['col1'][i],a['col2'][i]) 

a['distance12'] = dis 

Dies ist sehr ineffizient und würde Stunden dauern, wenn die Anzahl der Zeilen groß war. Könnte jemand bitte einen besseren Ansatz vorschlagen?

Antwort

3

Sie können normalerweise verhindern, dass ein Frame über die apply-Funktion durchlaufen wird. In Ihrem Fall würde es so aussehen:

a.apply(lambda row: graphlab.distances.cosine(row['col1'], row['col2'])) 

Das sollte deutlich schneller als das Schleifen in Python sein.