2016-07-26 120 views
2

我有一个看起来像这样的列表:迭代通过大熊猫行有效

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

和看起来像这样一个数据帧:

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

我期待在数据帧来创建一个新列它具有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

为什么需要if语句?它看起来总是对我真实? – Psidom

+0

检查nans。如果x是nan,x == x将返回false。 – 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

呃!即时通讯这样的假人!!!!!! – eljusticiero67