根据正则表达式匹配替换数据框中的字符串值

时间:2015-11-17 15:41:44

标签: python pandas

我有一个python数据框,其中包含一个名为“accredited”的列 此列应包含认证数据:“10/10/2011” 或者说:“不认可” 但在大多数情况下,如果未经认证,该专栏会有一些文字,例如: “这项业务没有被认可......” 我想替换整个文本,只是说:“不认可”

现在,我写了一个函数:

def notAcredited(string):
    if ('Not' in string or 'not' in string):
        return  'Not Accredited'

我正在使用循环实现该函数,是否可以使用“.apply”方法执行此操作?

for i in range(len(df_1000_1500)):
    accreditacion = notAcredited(df_1000_1500['BBBAccreditation'][i])
    if accreditacion == 'Not Accredited':
        df_1000_1500['BBBAccreditation'][i] = accreditacion

1 个答案:

答案 0 :(得分:4)

您可以使用矢量化字符串方法Series.str.replace

In [72]: df = pd.DataFrame({'accredited': ['10/10/2011', 'is not accredited']})

In [73]: df
Out[73]: 
          accredited
0         10/10/2011
1  is not accredited

In [74]: df['accredited'] = df['accredited'].str.replace(r'(?i).*not.*', 'not accredited')

In [75]: df
Out[75]: 
       accredited
0      10/10/2011
1  not accredited

传递给replace的第一个参数,例如r'(?i).*not.*',可以是任何regex pattern。第二个可以是任何正则表达式替换值 - 与re.sub接受的相同类型的字符串。正则表达式模式中的(?i)使模式不区分大小写,因此notNotNOtNoT等都会匹配。

Series.str.replace Cython化对re.sub的调用(这使得它比使用apply所能实现的速度更快,因为apply使用了Python循环。)