使用包含字符串的方式过滤pandas数据框中的行

30

我有一个Python Pandas数据框 df,其中包含许多行。 我要从这些行中切出并仅使用“body”列中包含单词“ball”的行。 为此,可以执行以下操作:

df[df['body'].str.contains('ball', case=False)]

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

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

但那不起作用。 我不确定是否应该在此上使用lambda函数或类似的东西。

2个回答

59

您可以再次使用.str来访问字符串方法,或者(在我看来更好)使用case=False来保证大小写不敏感:

您可以使用.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 警告,但如果我们只是在这里进行选择,则无关紧要。)

(注意:我真的不需要在那里指定“round”...)


太棒了。我差点要链接 str 事件了。我不知道 str.contains 有一个 case=False 选项。太好了。还有一个后续问题:我遇到了你提到的可怕的“SettingWithCopy Warning”。你可以详细说明一下吗?我的目标是创建一个仅包含包含“ball”的行的新数据帧。 - David
2
这个故事有点长,不太适合在评论区写。你可以阅读文档的这一部分来了解详细解释。 - DSM
非常感谢。我如何为过滤添加多个字符串? - YasserKhalil

0

您还可以在query中使用contains

In [2]: df = pd.DataFrame({'body': ['Ball', 'cUbE', 'bAll'], 'color': ['red', 'green', 'blue']})

In [3]: df
Out[3]: 
   body  color
0  Ball    red
1  cUbE  green
2  bAll   blue

In [4]: df.query('body.str.contains("ball", case=False).values')
Out[4]: 
   body color
0  Ball   red
2  bAll  blue

如果您想匹配多个模式,请使用|

In [5]: df.query('body.str.contains("ball|cube", case=False).values')
Out[5]: 
   body  color
0  Ball    red
1  cUbE  green
2  bAll   blue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接