按包含 str 过滤熊猫数据帧行

Posted

技术标签:

【中文标题】按包含 str 过滤熊猫数据帧行【英文标题】:Filtering pandas dataframe rows by contains str 【发布时间】:2015-12-13 11:48:59 【问题描述】:

我有一个带有很多行的 python pandas 数据框df。从这些行中,我想切出并仅使用“body”列中包含“ball”一词的行。为此,我可以这样做:

df[df['body'].str.contains('ball')]

问题是,我希望它不区分大小写,这意味着如果出现 Ball 或 bAll 这个词,我也会想要它们。进行不区分大小写搜索的一种方法是将字符串转换为小写,然后以这种方式进行搜索。我想知道如何去做。我试过了

df[df['body'].str.lower().contains('ball')]

但这不起作用。我不确定我是否应该在这个或那种性质的东西上使用 lambda 函数。

【问题讨论】:

【参考方案1】:

您可以再次使用.str 来访问字符串方法,或者(更好的是,恕我直言)使用case=False 来保证不区分大小写:

>>> df = pd.DataFrame("body": ["ball", "red BALL", "round sphere"])
>>> df[df["body"].str.contains("ball")]
   body
0  ball
>>> df[df["body"].str.lower().str.contains("ball")]
       body
0      ball
1  red BALL
>>> df[df["body"].str.contains("ball", case=False)]
       body
0      ball
1  red BALL
>>> df[df["body"].str.contains("ball", case=True)]
   body
0  ball

(请注意,如果您要进行作业,最好使用df.loc,以避免可怕的SettingWithCopyWarning,但如果我们只是选择这里也没关系。)

(注意 #2:我想我真的不需要在此处指定“圆形”..)

【讨论】:

太棒了。我接近链接str 事件。我不知道str.containscase=False 选项。那太棒了。再跟进:我收到了您提到的可怕的 SettingWithCopy 警告。你介意详细说明一下吗?我的目标是创建一个仅包含“ball”的行的新数据框 这个故事有点太长了,不能在 cmets 里写。您可以阅读文档的this section 以获得解释。 非常感谢。如何添加多个字符串进行过滤?

以上是关于按包含 str 过滤熊猫数据帧行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 按功能过滤数据帧行

通过匹配连续列中的值过滤 R 数据帧行

按时间戳列过滤/选择熊猫数据帧的行

熊猫数据框 - 按字符串过滤/选择列是不是保留顺序?

通过包含空值的列表过滤熊猫数据框

按天过滤熊猫数据框