2016-07-26 15 views
2

Ich habe eine Liste, die wie folgt aussieht:Iterate durch Pandas Reihen effizient

lst = ['a','b','c'] 

und einen Datenrahmen, der das wie folgt aussieht:

id col1 
1 ['a','c'] 
2 ['b'] 
3 ['b', 'a'] 

Ich suche eine neue Spalte in dem Datenrahmen erstellen das hat die Länge des Schnittpunkts der ersten und der einzelnen Listen von sp1

id col1   intersect 
1 ['a','c'] 2 
2 ['b']  1 
3 ['d', 'a'] 1 

Derzeit sieht mein Code wie aus dies:

df['intersection'] = np.nan 
for i, r in df.iterrows(): 
    ## If-Statement to deal with Nans in col1 
    if r['col1'] == r['col1']: 
     df['intersection'][i] = len(set(r['col1']).intersection(set(lst))) 

Das Problem ist, dass dieser Code ist extrem zeitaufwändig auf meinem Datensatz von 200K Zeilen und schneidet eine Liste von 200 Elementen. Gibt es eine Möglichkeit, dies effizienter zu tun?

Danke!

+0

Warum brauchen Sie die if-Anweisung? Sieht es für mich immer so aus? – Psidom

+0

auf nans überprüfen. x == x gibt false zurück, wenn x ein nan ist. – eljusticiero67

Antwort

3

Haben Sie das versucht?

lstset = set(lst) 
df['intersection'] = df['col1'].apply(lambda x: len(set(x).intersection(lstset))) 

Eine andere Möglichkeit ist

df['intersection'] = df['col1'].apply(lambda x: len([1 for item in x if item in lst])) 
+0

Pfui! Ich bin so ein Dummy !!!!!! – eljusticiero67