如何从Pandas数据框中过滤包含string模式的行

假设我们在Python Pandas中有一个数据框,如下所示:

df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']}) 

或者,以表格forms:

 ids vals aball 1 bball 2 cnut 3 fball 4 

如何过滤包含关键词“球”的行? 例如,输出应该是:

 ids vals aball 1 bball 2 fball 4 
 In [3]: df[df['ids'].str.contains("ball")] Out[3]: ids vals 0 aball 1 1 bball 2 3 fball 4 
 df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1 

逐步的解释(从内到外):

  • df['ids']select数据框的ids列(技术上,对象df[ids]pandas.Seriestypes的)
  • df['ids'].str允许我们将向量化的string方法(例如, lowercontains )应用于Series
  • df['ids'].str.contains('ball')检查系列的每个元素是否有string'ball'作为子string。 结果是一系列的布尔值表示“球”子串的存在是True还是False的。
  • df[df['ids'].str.contains('ball')]将布尔值“mask”应用于数据框,并返回包含适当logging的视图。
  • na = False从考虑中删除NA / NaN值; 否则可能返回一个ValueError。
 >>> mask = df['ids'].str.contains('ball') >>> mask 0 True 1 True 2 False 3 True Name: ids, dtype: bool >>> df[mask] ids vals 0 aball 1 1 bball 2 3 fball 4 

尝试这个:

 def filterdf(df, f, col): return df[f(df, col)] 

然后:

 filterdf(df, lambda df, col: df[col].str.contains 'ball')