pandas+数据框 – select部分string

我有一个DataFrame有4列其中2包含string值。 我想知道是否有一种方法来select基于对特定列的部分string匹配的行?

换句话说,一个函数或lambda函数会做类似的事情

 re.search(pattern, cell_in_question) 

返回一个布尔值。 我熟悉df[df['A'] == "hello world"]的语法,但似乎无法find与部分string匹配相同的方法,例如'hello'

有人能指出我正确的方向吗?

基于github问题#620 ,看起来你很快就可以做到以下几点:

 df[df['A'].str.contains("hello")] 

更新: 向量化的string方法(即Series.str)可在pandas 0.8.1及更高版本中使用。

我在ipython笔记本上使用macos上的pandas0.14.1。 我尝试了上面的build议行:

 df[df['A'].str.contains("Hello|Britain")] 

并得到一个错误:

 "cannot index with vector containing NA / NaN values" 

但是当“== True”条件被添加时它工作得很好,像这样:

 df[df['A'].str.contains("Hello|Britain")==True] 

快速提示:如果您想根据索引中包含的部分string进行select,请尝试以下操作:

 df['stridx']=df.index df[df['stridx'].str.contains("Hello|Britain")] 

假设你有下面的DataFrame

 >>> df = pd.DataFrame([['hello', 'hello world'], ['abcd', 'defg']], columns=['a','b']) >>> df ab 0 hello hello world 1 abcd defg 

您总是可以在lambdaexpression式中使用in运算符来创build您的filter。

 >>> df.apply(lambda x: x['a'] in x['b'], axis=1) 0 True 1 False dtype: bool 

这里的技巧是在apply使用axis=1选项来将元素逐行传递给lambda函数,而不是逐列传递。

如果有人想知道如何执行相关的问题: “通过部分stringselect列”

使用:

 df.filter(like='a') 

这是我最终做的部分string匹配。 如果有人有这样做的更有效的方式请让我知道。

 def stringSearchColumn_DataFrame(df, colName, regex): newdf = DataFrame() for idx, record in df[colName].iteritems(): if re.search(regex, record): newdf = concat([df[df[colName] == record], newdf], ignore_index=True) return newdf 

除了“传统”,“超凡”等更多的标准外,你如何过滤“自由”?

  df_Fixed[~df_Fixed["Busler Group"].map(lambda x: x.startswith('Liberty'))]