【问题标题】:Filtering pandas dataframe rows by contains str按包含 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 函数。

【问题讨论】:

    标签: python string pandas


    【解决方案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 以获得解释。
    • 非常感谢。如何添加多个字符串进行过滤?
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2022-10-04
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多