2016-08-08 5 views
1

文字列が列の値である行をフィルタリングする場合は、data.sample_id.str.contains('hph')(前に回答:check if string in pandas dataframe column is in list、またはCheck if string is in a pandas dataframe)などを使用できます。pandas stringにルックアップが含まれています: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

(@ jezraelの答え)きれいになりna=Falseを渡すと思う:

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 

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

EdChumサンプルを使用します

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 

NaN値は存在しませんように第1 dropnaを呼び出すことによって、あなたはその後、安全にSeriesstr.containsを使用することができます

null値を処理する別の方法は、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 

が、私はあなたがstr.containsFalseへのパラメータnaを設定することができます

関連する問題