如何从 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.Seriesdf['ids'].str 允许我们将向量化字符串方法(例如,lowercontains)应用于系列 df['ids'].str.contains('ball') 检查系列的 每个 元素,以确定元素值是否具有字符串 'ball' 作为子字符串。结果是一系列布尔值,指示 TrueFalse 关于“球”子字符串的存在。 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 数据框中的行?

如何在整个 Pandas 数据框中搜索字符串并获取包含它的列的名称?

Python Pandas:如何从包含列表中值的数据框中删除所有列?

Pandas 过滤多个串联子串

从 pandas 数据框中的元组列中删除元素

为啥我的代码没有从 Pandas 数据框中选择数据? [复制]