You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:55:42