我最近开始使用re软件包来清理交易说明。
原始交易说明示例:
['bread','payment to facebook.com', 'milk', 'savings', 'amazon.com $xx ased lux', 'holiday_amazon']
对于表达式列表,我想用更好的表达式替换当前描述,例如如果其中一个列表条目包含'facebook'或'amazon'并以空格开头(或在字符串的开头),我想分别用单词'facebook'或'amazon'替换整个列表条目,即:
['bread', 'facebook', 'milk', 'savings', 'amazon', 'holiday_amazon']
由于我只想在单词facebook之前带有空格或单词开头的情况下选择它,因此我创建了表示此的正则表达式,例如(^ | \ s)facebook。请注意,这只是一个例子,实际上我也想过滤掉更复杂的表达式。
我总共有一个要替换的90个这样的表达式的数据框。
我当前的代码(以最小的可行示例为例)
import pandas as pd
import re
def specialCases(list_of_narratives, replacement_dataframe):
# Create output array
new_narratives = []
special_cases_identifiers = replacement_dataframe["REGEX_TEST"]
# For each string element of the list
for memo in list_of_narratives:
index_count = 0
found_count = 0
for i in special_cases_identifiers:
regex = re.compile(i)
if re.search(regex, memo.lower()) is not None:
new_narratives.append(replacement_dataframe["NARRATIVE_TO"].values[index_count].lower())
index_count += 1
found_count += 1
break
else:
index_count += 1
if found_count == 0:
new_narratives.append(memo.lower())
return new_narratives
# Minimum example creation
list_of_narratives = ['bread','payment to facebook.com', 'milk', 'savings', 'amazon.com $xx ased lux', 'holiday_amazon']
list_of_regex_expressions = ['(^|\s)facebook', '(^|\s)amazon']
list_of_regex_replacements = ['facebook', 'amazon']
replacement_dataframe = pd.DataFrame({'REGEX_TEST': list_of_regex_expressions, 'NARRATIVE_TO': list_of_regex_replacements})
# run code
new_narratives = specialCases(list_of_narratives, replacement_dataframe)
但是,要替换超过100万个列表条目和90种不同的正则表达式(即len(list_of_regex_expressions)为90),这可能非常慢,这可能是由于double for循环所致。
有人可以帮助我提高这段代码的性能吗?