如何从Pandas数据帧中过滤包含字符串模式的行

时间:2015-01-15 23:44:22

标签: python pandas dataframe

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

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

如何过滤包含关键字“ball?”的行?例如,输出应为:

ids    vals
aball   1
bball   2
fball   4

4 个答案:

答案 0 :(得分:178)

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

答案 1 :(得分:61)

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')检查系列的每个元素,以确定元素值是否将字符串'ball'作为子字符串。结果是一系列布尔值指示TrueFalse关于“球”子串的存在。
  • df[df['ids'].str.contains('ball')]将布尔'掩码'应用于数据帧,并返回包含相应记录的视图。
  • na = False删除NA / NaN值;否则可能会返回ValueError。

答案 2 :(得分:9)

>>> 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

答案 3 :(得分:6)

如果要将筛选的列设置为新索引,还可以考虑使用.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结尾的行。在这种情况下,您使用

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

       vals
ids        
aball     1
bball     2
fball     4

请注意,现在包含ballxyz的条目不包括在内,因为它以ball开头,并且不以此结尾。

如果您希望获得以ball开头的所有条目,则可以使用

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

产生

         vals
ids          
ballxyz     5

同样适用于列;您需要更改的是axis=0部分。如果您根据列进行过滤,则为axis=1