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

Joh*_*ght 108 python dataframe pandas

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

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

或者,以表格形式:

ids    vals
aball   1
bball   2
cnut    3
fball   4
Run Code Online (Sandbox Code Playgroud)

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

ids    vals
aball   1
bball   2
fball   4
Run Code Online (Sandbox Code Playgroud)

Ami*_*mit 223

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

  • @ user4896331 - `df [~df ['ids'].str.contains("ball")]`,`~`否定条件 (34认同)
  • 你怎么反过来找到所有不包含字符串的行? (7认同)

Jub*_*les 69

df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1
Run Code Online (Sandbox Code Playgroud)

逐步解释(从内到外):

  • df['ids']选择ids数据框的列(技术上,对象df['ids']是类型pandas.Series)
  • df['ids'].str允许我们将向量化的字符串方法(例如lower,contains)应用于Series
  • df['ids'].str.contains('ball')检查Series的每个元素,以确定元素值是否将字符串'ball'作为子字符串.结果是一系列布尔指示True或表示False存在"球"子串.
  • df[df['ids'].str.contains('ball')] 将布尔"掩码"应用于数据帧并返回包含适当记录的视图.
  • na = False从考虑中删除NA/NaN值; 否则可能会返回ValueError.

  • 如果你用 `'|'.join(list_of_balls)` 代替 `'ball'`,你可以将一个字符串列表应用到搜索中。虽然 `'|'.join(list_of_balls)` 创建了一个带有 OR 的 RegEx 来搜索有效字符串 (3认同)
  • 当有人做一步一步的解释时,绝对喜欢它.这真的有助于理解! (2认同)
  • 请注意,您可以通过添加 `case=False` 使过滤器不区分大小写,重新使用 `df[df['ids'].str.contains('ball', case=False,na = False)]` (2认同)

use*_*991 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
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。 (3认同)

Cle*_*leb 7

如果要将筛选的列设置为新索引,还可以考虑使用.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
Run Code Online (Sandbox Code Playgroud)

并且您的计划是过滤ids包含ballAND设置ids为新索引的所有行,您可以这样做

df.set_index('ids').filter(like='ball', axis=0)
Run Code Online (Sandbox Code Playgroud)

这使

         vals
ids          
aball       1
bball       2
fball       4
ballxyz     5
Run Code Online (Sandbox Code Playgroud)

filter也允许您传递正则表达式,因此您也可以只过滤列条目结尾的那些行ball.在这种情况下你使用

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

       vals
ids        
aball     1
bball     2
fball     4
Run Code Online (Sandbox Code Playgroud)

请注意,现在条目ballxyz不包括在内,因为它开头ball并且不以它结束.

如果您想获得所有以ball您开头的条目,可以简单使用

df.set_index('ids').filter(regex='^ball', axis=0)
Run Code Online (Sandbox Code Playgroud)

生产

         vals
ids          
ballxyz     5
Run Code Online (Sandbox Code Playgroud)

同样适用于列; 你需要改变的只是axis=0部分.如果你根据列进行过滤,那就是axis=1.