Pandas将字符串对象转换为小写并检查字符串

48

我有以下代码:

import pandas as pd
private = pd.read_excel("file.xlsx","Pri")
public = pd.read_excel("file.xlsx","Pub")
private["ISH"] = private.HolidayName.str.lower().contains("holiday|recess")
public["ISH"] = public.HolidayName.str.lower().contains("holiday|recess")

我遇到了以下错误:

AttributeError: 'Series' object has no attribute 'contains'

有没有一种方法可以在一步中将“HolidayName”列转换为小写,并检查正则表达式("Holiday|Recess")是否包含在其中,使用.contains

有没有办法在一个步骤中将“HolidayName”列转换为小写并使用.contains检查正则表达式("Holiday|Recess")


1
如果将术语转换为小写,它们就不会包含大写字母,如 HR - DSM
谢谢你指出来。当我打出我的例子时,那是一个疏忽。已经修复了。 - user1452759
2个回答

91
private["ISH"] = private.HolidayName.str.contains("(?i)holiday|recess")

正则表达式模式中的(?i)告诉re模块忽略大小写。


你之前遇到错误的原因是因为Series对象没有contains方法,相反,Series.str属性有contains方法。因此,你可以通过以下方式避免错误:

private["ISH"] = private.HolidayName.str.lower().str.contains("holiday|recess")

不错!这个在文档中有提到吗?这是 Pandas 特有的东西,还是其他什么呢?我猜是其他东西。 - william_grisaitis
@grisaitis:向量化字符串方法在此处有文档。 使用(?i)进行不区分大小写的模式匹配是Python re模块的正则表达式语法的一部分。(搜索字符串(?iLmsux))。 - unutbu
1
很遗憾,解决这个问题的最佳答案涉及对正则表达式的深入了解。像我这样的新手正在寻求链接字符串操作的方法。 - BobHy
只是补充一下,如果你想要一个精确匹配,那么 df[(private['HolidayName'].str.lower() == "holiday")] 应该可以工作。 - ggupta

24

虽然我来晚了,但你可以使用关键字参数case: bool, 默认为True。如果为True,则区分大小写。

private["ISH"] = private.HolidayName.str.contains("holiday|recess", case=False)
public["ISH"] = public.HolidayName.str.contains("holiday|recess", case=False)

3
FYI - 我检查了三种方法(串联字符串,使用正则表达式,使用参数 case=False)...... 结果发现正则表达式最快,参数 case=False 的方法大约慢1.25倍,串联字符串的方法大约慢1.06倍。 - Derek Eden

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