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

假设我们在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

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

ids    vals
aball   1
bball   2
fball   4
593918 次浏览
>>> 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
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']选择数据帧的ids列(严格来说,对象df['ids']的类型是pandas.Series)
  • df['ids'].str允许我们将向量化的字符串方法(例如,lowercontains)应用于Series
  • df['ids'].str.contains('ball')检查该系列的每一个元素的元素值是否有字符串'ball'作为子字符串。结果是一系列布尔值,指示TrueFalse关于'ball'子串的存在。
  • df[df['ids'].str.contains('ball')]将布尔值“mask”应用到数据帧,并返回一个包含适当记录的视图。
  • na = False从考虑中删除NA / NaN值;否则返回ValueError。

如果你想将筛选的列设置为一个新索引,你也可以考虑使用.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