如何基于Pandas实现不区分大小写和空格的部分字符串匹配映射?
解决方案
我用以下代码创建了state_code到地区名称的映射字典,现在需要实现部分字符串匹配功能:当文本中出现East South Central Division Conv这类内容时,将其对应到state_code为1、21、28、47的地区,且匹配需满足不区分大小写、忽略空格的要求。我的DataFrame(df)包含state_code列,值示例为9、23、25、33,当前映射代码如下:
dct.update(dict.fromkeys([34,36,42],'Middle Atlantic')) dct.update(dict.fromkeys([18,17,26,39,55],'East North Central')) dct.update(dict.fromkeys([19,20,27,29,31,38,46],'West North Central')) dct.update(dict.fromkeys([10,11,12,13,24,37,45,51,54],'South Atlantic')) dct.update(dict.fromkeys([1,21,28,47],'East South Central')) dct.update(dict.fromkeys([5,22,40,48],'West South Central')) dct.update(dict.fromkeys([4,8,16,35,30,49,32,56],'Mountain')) dct.update(dict.fromkeys([2,6,15,41,53],'Pacific')) dct.update(dict.fromkeys([0],'Other')) df['MAPPING'] = df['state_code'].map(dct)
实现步骤与代码
1. 构建反向映射字典
把原有的"state_code→地区"映射反转成"地区→state_code列表",方便后续匹配:
region_to_codes = { 'Middle Atlantic': [34, 36, 42], 'East North Central': [18, 17, 26, 39, 55], 'West North Central': [19, 20, 27, 29, 31, 38, 46], 'South Atlantic': [10, 11, 12, 13, 24, 37, 45, 51, 54], 'East South Central': [1, 21, 28, 47], 'West South Central': [5, 22, 40, 48], 'Mountain': [4, 8, 16, 35, 30, 49, 32, 56], 'Pacific': [2, 6, 15, 41, 53], 'Other': [0] }
2. 编写文本标准化函数
统一处理文本格式,满足不区分大小写、忽略空格的匹配要求:
def normalize_text(text): # 转小写并移除所有空格 return text.lower().replace(' ', '')
3. 单文本匹配示例
针对单个输入文本,找到对应的state_code:
input_text = "East South Central Division Conv" normalized_input = normalize_text(input_text) matched_codes = [] for region, codes in region_to_codes.items(): normalized_region = normalize_text(region) # 检查标准化后的文本是否包含标准化的地区名称(部分匹配) if normalized_region in normalized_input: matched_codes.extend(codes) # 去重并整理结果 matched_codes = list(set(matched_codes)) print(matched_codes) # 输出: [1, 21, 28, 47]
4. DataFrame中批量处理
如果你的DataFrame有文本列(比如text列),可以批量匹配并标记:
# 定义批量匹配函数 def get_matched_codes(text): normalized_input = normalize_text(text) codes = [] for region, cs in region_to_codes.items(): if normalize_text(region) in normalized_input: codes.extend(cs) return list(set(codes)) # 为每行添加匹配的state_code列表 df['MATCHED_CODES'] = df['text'].apply(get_matched_codes) # 标记该行是否匹配到对应地区 df['IS_MATCHED'] = df['MATCHED_CODES'].apply(lambda x: len(x) > 0) # 筛选出匹配的行 filtered_df = df[df['IS_MATCHED']]
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

