2015-01-15 177 views
39

过滤包含字符串模式行假设我们有在Python大熊猫的数据帧,看起来像这样:如何从大熊猫数据帧

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

或者,以表格的形式:

ids vals 
aball 1 
bball 2 
cnut 3 
fball 4 

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

ids vals 
aball 1 
bball 2 
fball 4 
+2

您应该接受已发布的5个答案中的一个,在投票按钮下方会出现一个勾号标记,请注意,'str.contains'答案可能是您的要求中最快和推荐的方法:http:/ /pandas.pydata.org/pandas-docs/stable/generated/pandas.core.strings.StringMethods.contains.html#pandas.core.strings.StringMethods.contains – EdChum

回答

83
In [3]: df[df['ids'].str.contains("ball")] 
Out[3]: 
    ids vals 
0 aball  1 
1 bball  2 
3 fball  4 
+0

嗨艾米特,非常感谢,完美的作品! –

+0

@JohnKnight - 不客气! – Amit

+1

如何反转此查找所有不包含字符串的行? – user4896331

7
>>> 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 
31
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1 

步骤一步解释(从内到外):

  • df['ids']选择的所述ids柱数据帧(技术上,对象df[ids]pandas.Series的类型)
  • df['ids'].str允许我们应用矢量化的字符串方法(例如,lowercontains)到系列
  • df['ids'].str.contains('ball')检查每个Series元素作为该元素的值是否具有字符串“球”作为子字符串。结果是一系列布尔值指示TrueFalse关于“球”子串的存在。
  • df[df['ids'].str.contains('ball')]将布尔'mask'应用于数据框并返回包含适当记录的视图。
  • na = False从考虑中删除NA/NaN值;否则可能会返回一个ValueError。
+0

您能解释一下代码在做什么以及它是如何工作的吗? – Kevin

+0

如何使用部分匹配并使用部分匹配“#”来获取剩余的字符串:str'就像这样? –

+2

当有人做了一步一步的解释时,绝对喜欢它。这真的有助于理解! – user4896331

1

如果您想将您筛选的列设置为新索引,那么您也可以考虑使用.filter;如果你想保持它作为一个单独的列,然后str.contains是要走的路。

比方说,你有

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

     ids vals 
0 aball  1 
1 bball  2 
2  cnut  3 
3 fball  4 
4 ballxyz  5 

,你的计划是过滤器,其中ids包含ball并设置ids新索引的所有行,你可以做

df.set_index('ids').filter(like='ball', axis=0) 

这给

  vals 
ids   
aball  1 
bball  2 
fball  4 
ballxyz  5 

但是filter还允许您传递正则表达式,因此您还可以仅筛选列条目以ball结尾的那些行。在这种情况下,你使用现在,因为它与ball开始,不与它到底是不是包含ballxyz进入

df.set_index('ids').filter(regex='ball$', axis=0) 

     vals 
ids   
aball  1 
bball  2 
fball  4 

注意。

如果你想获得与ball开始的所有条目,你可以简单的使用

df.set_index('ids').filter(regex='^ball', axis=0) 

产生

  vals 
ids   
ballxyz  5 

同一作品的列;所有你需要改变的是axis=0部分。如果你根据列进行过滤,那将是axis=1