假设我们在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
答案 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
允许我们将矢量化字符串方法(例如lower
,contains
)应用于系列df['ids'].str.contains('ball')
检查系列的每个元素,以确定元素值是否将字符串'ball'作为子字符串。结果是一系列布尔值指示True
或False
关于“球”子串的存在。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
。