如何从 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
允许我们将向量化字符串方法(例如,lower
、contains
)应用于 Series
df['ids'].str.contains('ball')
检查 Series 的 each 元素,以确定元素值是否具有字符串 'ball' 作为子字符串。结果是一系列布尔值,指示 True
或 False
关于 '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
.
假设我们在 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
允许我们将向量化字符串方法(例如,lower
、contains
)应用于 Seriesdf['ids'].str.contains('ball')
检查 Series 的 each 元素,以确定元素值是否具有字符串 'ball' 作为子字符串。结果是一系列布尔值,指示True
或False
关于 '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
.