2016-08-08 173 views
1

如果要过滤字符串在列值中的那些行,可以使用类似data.sample_id.str.contains('hph')(之前回答:check if string in pandas dataframe column is in listCheck if string is in a pandas dataframe)的内容。pandas字符串包含查找:NaN导致值错误

但是,我的查找列包含emtpy单元格。因此,str.contains()产生NaN值,我得到索引值的错误。

`ValueError: cannot index with vector containing NA/NaN values`` 

什么工作:

# get all runs 
mask = [index for index, item in enumerate(data.sample_id.values) if 'zent' in str(item)] 

有一个比这更优雅且快速的方法(类似于str.contains())?

回答

1

您可以str.containsFalse设置参数na

print (df.a.str.contains('hph', na=False)) 

使用EdChum样本:

df = pd.DataFrame({'a':['hph', np.NaN, 'sadhphsad', 'hello']}) 
print (df) 
      a 
0  hph 
1  NaN 
2 sadhphsad 
3  hello 

print (df.a.str.contains('hph', na=False)) 
0  True 
1 False 
2  True 
3 False 
Name: a, dtype: bool 
1

IIUC可以过滤那些排了也

data['sample'].dropna().str.contains('hph') 

例子:

In [38]: 
df =pd.DataFrame({'a':['hph', np.NaN, 'sadhphsad', 'hello']}) 
df 

Out[38]: 
      a 
0  hph 
1  NaN 
2 sadhphsad 
3  hello 

In [39]: 
df['a'].dropna().str.contains('hph') 

Out[39]: 
0  True 
2  True 
3 False 
Name: a, dtype: bool 

那么通过调用dropna首先,你就可以放心地使用str.containsSeries因为不会有NaN

处理空值的另一种方法是使用notnull

In [43]: 
(df['a'].notnull()) & (df['a'].str.contains('hph')) 

Out[43]: 
0  True 
1 False 
2  True 
3 False 
Name: a, dtype: bool 

,但我认为经过na=False将清洁剂(@ jezrael的答案)