如何利用映射字典批量实现Pandas字符串列的手动词形归一化?
Pandas批量实现交易字符串的词形归一化
解决方案思路
要高效完成批量替换,核心是把原映射字典转换成「变体词→主词」的反向映射,再利用正则表达式一次性匹配所有变体并替换,避免多次调用str.replace带来的性能损耗。
具体实现代码
import pandas as pd import re # 原始数据 list1 = ['0412 UBER TRIP HELP.UBER.COMCA', '0410 UBER TRIP HELP.UBER.COMCA', 'MOBILE PURCHASE 0410 VALENCIA WHOLE FOODS SAN FRANCISCOCA', 'WHOLEFDS WBG#1 04/13 PURCHASE WHOLEFDS WBG#104 BROOKLYN NY', '0414 LYFT *CITI BIKE BIK LYFT.COM CA', '0421 WALGREENS.COM 877-250-5823 IL', '0421 Rapha Racing PMT LLC XXX-XX72742 OR', '0422 UBER EATS PAYMENT HELP.UBER.COMCA', '0912 WHOLEFDS NOE 10379 SAN FRANCISCOCA', 'PURCHASE 1003 CAVIAR*JUNOON WWW.DOORDASH.CA'] df = pd.DataFrame(list1, columns=['feature']) # 原始映射字典 map1 = {'payment':['pmts','pmnt','pmt','pmts','pyment','pymnts'], 'account':['acct'], 'pharmacy':['walgreens','walgreen','riteaid','cvs','pharm'], 'food_delivery':['uber eats','doordash','seamless','grubhub','caviar'], 'ride_share':['uber','lyft'], 'whole_foods':['wholefds','whole foods','whole food'] } # 步骤1:反转映射字典,生成「变体词→主词」的对应关系 reverse_map = {} for main_term, variants in map1.items(): for variant in variants: # 统一转小写,避免大小写匹配问题 reverse_map[variant.lower()] = main_term # 步骤2:构建正则表达式模式,匹配所有变体词(忽略大小写,匹配完整单词) # re.escape处理变体中的特殊字符,\b确保只匹配完整单词 pattern = re.compile( r'\b(' + '|'.join(re.escape(v) for v in reverse_map.keys()) + r')\b', flags=re.IGNORECASE ) # 步骤3:定义替换函数,根据匹配结果返回对应主词 def replace_match(match): return reverse_map[match.group().lower()] # 步骤4:批量替换生成归一化后的列 df['normalized_feature'] = df['feature'].str.replace(pattern, replace_match) # 查看结果 print(df[['feature', 'normalized_feature']])
关键细节说明
- 大小写兼容:通过
re.IGNORECASE和统一转小写的处理,不管原字符串是大写、小写还是混合,都能正确匹配变体词。 - 完整单词匹配:使用
\b单词边界,避免出现部分匹配(比如不会把包含"pmt"的其他无关单词误替换)。 - 性能优化:仅需对字符串列遍历一次,相比多次调用
str.replace,数据量越大,效率提升越明显。
内容的提问来源于stack exchange,提问作者Zenvega
相关产品推荐
相关产品推荐

