Python:在数据框上应用正则表达式,以日期时间为列

Posted

技术标签:

【中文标题】Python:在数据框上应用正则表达式,以日期时间为列【英文标题】:Python: apply regex on dataframe with datetime as a column 【发布时间】:2019-07-21 23:42:37 【问题描述】:

我有一个数据框(df)如下

Index     Month     Time       Text_1          Text_2                 Text_3
  0      02/2019   19:44:33   aadd@34:9984    (none)\       62fa6297-f5f5-4c47-8236-4a85cad5e601
                                             STBROWN2-M-26YQ
  1      02/2019   19:30:22   58:EF:68:14    (none)\        f933fb2a-4dde-a547-80ca-3b9e6cd29a6d
                                             STBROWN2-M-26YQ

我写了一个简单的正则表达式如下

def clean(text):
text = text.lower()
text_clean = re.sub('[^A-Za-z0-9]', ' ', text)
return text_clean

然后我将以上内容应用到df

df.apply(lambda x : clean(x))

我收到以下错误:

AttributeError: ("'Series' object has no attribute 'lower'", 'occurred at index Application')

这可能是因为 MonthTime 列,因为它们是 datetime 对象。

我的问题是:如何在忽略日期时间的情况下应用正则表达式?

【问题讨论】:

努力完成上述工作。 TypeError: ('expected string or bytes-like object', 'occurred at index Application') 【参考方案1】:

使用过滤器选择以 Text 开头的列

def clean(text):
    text = text.str.lower()
    text_clean = text.str.replace('[^A-Za-z0-9]', ' ', regex = True)
    return text_clean
df.assign(**df.filter(like = 'Text').apply(clean))

【讨论】:

这个解决方案不能正常工作。即使您将clean 应用到我分享的示例df 上,也没有必要。 @pythondumb,我已经对您的代码进行了修改,这样它就不会抛出 Attributeerror。如果您希望代码以不同的方式执行,则需要提供预期的输出。 将尝试使用更丰富的df 值重新发布此内容。【参考方案2】:

在您的数据中,我认为所有数据都是字符串,但如果要排除日期时间列,请使用 select_dtypes:

def clean(text):
    return text.str.lower().str.replace('[^A-Za-z0-9]', '')

#filter only object columns
mask = df.dtypes == 'object'
#filter Text columns if possible
#mask = df.columns.startswith('Text')

df.loc[:, mask] = df.loc[:, mask].apply(clean)

【讨论】:

以上是关于Python:在数据框上应用正则表达式,以日期时间为列的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 验证插件,如何在文本框上添加正则表达式验证?

在python中使用正则表达式提取日期

python正则表达式匹配中文日期时间

python正则表达式匹配中文日期时间

[Python] 正则表达式

简单的正则表达式日期验证