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

>>> 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'] selects the ids column of the data frame (technically, the object df['ids'] is of type pandas.Series) df['ids'].str allows us to apply vectorized string methods (e.g., lower, contains) to the Series df['ids'].str.contains('ball') checks each element of the Series as to whether the element value has the string 'ball' as a substring. The result is a Series of Booleans indicating True or False about the existence of a 'ball' substring. df[df['ids'].str.contains('ball')] applies the Boolean 'mask' to the dataframe and returns a view containing appropriate records. na = False removes NA / NaN values from consideration; otherwise a ValueError may be returned.


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

你的计划是过滤所有行,其中id包含球和设置id为新索引,你可以这样做

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

这同样适用于圆柱;然后你需要改变的是轴=0部分。如果您基于列进行过滤,则它将是axis=1。