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

How to filter rows containing a string pattern from a Pandas dataframe

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

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

或者,在 table 形式中:

ids    vals
aball   1
bball   2
cnut    3
fball   4

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

ids    vals
aball   1
bball   2
fball   4
>>> 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') 检查 Series 的 each 元素,以确定元素值是否具有字符串 'ball' 作为子字符串。结果是一系列布尔值,指示 TrueFalse 关于 'ball' 子字符串的存在。
  • df[df['ids'].str.contains('ball')] 将布尔值 'mask' 应用于数据框,并 returns 包含适当记录的视图。
  • 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.