如何从 Pandas 数据框中过滤包含字符串模式的行 [重复]
Posted
技术标签:
【中文标题】如何从 Pandas 数据框中过滤包含字符串模式的行 [重复]【英文标题】:How to filter rows containing a string pattern from a Pandas dataframe [duplicate] 【发布时间】:2015-03-14 12:47:40 【问题描述】:假设我们在 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
【问题讨论】:
您应该接受已发布的 5 个答案之一,投票按钮下方会有一个勾号,请注意,str.contains
答案可能是满足您要求的最快且推荐的方法: pandas.pydata.org/pandas-docs/stable/generated/…
【参考方案1】:
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
ids vals
0 aball 1
1 bball 2
3 fball 4
【讨论】:
你将如何反转它以找到所有不包含字符串的行? @user4896331 -df[~df['ids'].str.contains("ball")]
, ~
否定条件
如果它是一个特定的词,要否定,你也可以使用:df = df[df.id != "ball"]
@Brian - 是的,在上面的 df 中,您可以尝试 df = df[df.ids != "aball"]
来查看它的实际效果。
@Amit:我需要通过 id 而不是名称来访问列。但是尝试 str 给我一个错误 [AttributeError: 'DataFrame' object has no attribute 'str'] new pandas 不支持它还是因为基于数字的访问?【参考方案2】:
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。
【讨论】:
您能解释一下这段代码在做什么以及它是如何工作的吗? 如何使用部分匹配并通过部分匹配'#':str
获取剩余字符串?
非常喜欢有人逐步解释。这对理解很有帮助!
如果您将'ball'
替换为'|'.join(list_of_balls)
,则可以将字符串列表应用于搜索。而'|'.join(list_of_balls)
使用 OR 创建一个正则表达式来搜索有效字符串
注意,可以添加case=False
使过滤器不区分大小写,在df[df['ids'].str.contains('ball', case=False,na = False)]
中重复使用【参考方案3】:
>>> 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
【讨论】:
这应该是公认的答案。【参考方案4】:如果要将过滤的列设置为新索引,也可以考虑使用.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
。
【讨论】:
刚看到您的帖子,因为我正在寻找类似的解决方案。我使用了您提到的过滤方法,但未能获得所需的结果。问题是here 你介意看看我的代码/方法是否有问题吗? IMO 虽然我无法使其工作,但它应该非常简单。 @BowenLiu:我在那里添加了一个答案,请检查它是否适合你。 刚在我的笔记本电脑上过夜。很快就会这样做,非常感谢。以上是关于如何从 Pandas 数据框中过滤包含字符串模式的行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在整个 Pandas 数据框中搜索字符串并获取包含它的列的名称?