如果您想过滤字符串在列值中的行,可以使用data.sample_id.str.contains('hph')
之类的内容(之前已回答:check if string in pandas dataframe column is in list或Check 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()
)?
答案 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