我有一个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
答案 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)
使模式不区分大小写,因此not
,Not
,NOt
,NoT
等都会匹配。
Series.str.replace
Cython化对re.sub
的调用(这使得它比使用apply
所能实现的速度更快,因为apply
使用了Python循环。)