2016-07-26 4 views
2

У меня есть список, который выглядит следующим образом:Итерация панд строк эффективно

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

и dataframe который выглядит следующим образом:

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

Я ищу, чтобы создать новый столбец в dataframe который имеет длину пересечения 1-го и отдельных списков от col1

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

В настоящее время мой код выглядит так: это:

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))) 

Проблема заключается в том, что этот код очень много времени на моем наборе данных 200K строк и пересекающиеся со списком 200 элементов. Есть ли способ сделать это более эффективно?

Спасибо!

+0

Зачем вам нужен, если заявление? Кажется, это всегда верно для меня? – Psidom

+0

для проверки для nans. x == x вернет false, если x является наном. – eljusticiero67

ответ

3

Вы пробовали это?

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

Другая возможность

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

ugh! им такой манекен !!!!!! – eljusticiero67

Смежные вопросы