pandas字符串包含查找:NaN导致值错误

时间:2016-08-08 10:51:49

标签: pandas

如果您想过滤字符串在列值中的行,可以使用data.sample_id.str.contains('hph')之类的内容(之前已回答:check if string in pandas dataframe column is in listCheck if string is in a pandas dataframe

但是,我的查阅列包含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())?

2 个答案:

答案 0 :(得分:2)

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.contains上的Series,因为没有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&#39>)

答案 1 :(得分:1)

您可以将str.contains中的参数na设置为False

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