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

如何高效替换DataFrame字符串中匹配映射表子串为对应数值?

高效替换DataFrame中含指定子串的字符串

问题背景

现有映射字典:

mapping = {'sum12':2, 'sum6':1,
            'avg12':2, 'avg6':1,
            'diff':3, 'mean':4}

以及如下结构的DataFrame:

var1      var2
0  abc_sum12  mean_jkl
1   pqr_sum6  pqr_avg6
2   diff_xyz    qwerty

需求:若DataFrame中的字符串包含映射字典中的任一子串,则将该字符串替换为子串对应的数值;若无匹配子串,则替换为np.nan,希望找到比逐行遍历更高效的实现方案。

优化实现方案

无需逐行遍历,可借助Pandas的字符串处理方法结合正则表达式快速实现,核心思路是:

  • 先将映射字典的键转换为正则匹配模式,按子串长度从长到短排序,避免短子串优先匹配(比如sum6会错误匹配sum12的前缀)
  • 用str.extract提取匹配的子串,再通过map映射为对应数值,无匹配项自动转为np.nan

具体代码如下:

import pandas as pd
import numpy as np

# 定义映射字典和目标DataFrame
mapping = {'sum12':2, 'sum6':1,
            'avg12':2, 'avg6':1,
            'diff':3, 'mean':4}
df = pd.DataFrame({
    'var1': ['abc_sum12', 'pqr_sum6', 'diff_xyz'],
    'var2': ['mean_jkl', 'pqr_avg6', 'qwerty']
})

# 生成正则匹配模式:长串优先匹配
pattern = '|'.join(sorted(mapping.keys(), key=len, reverse=True))
# 对所有列批量处理提取、映射
result_df = df.apply(lambda col: col.str.extract(f'({pattern})', expand=False).map(mapping))

print(result_df)

最终输出

运行代码后得到结果:

var1  var2
0     2   4.0
1     1   1.0
2     3   NaN

内容的提问来源于stack exchange,提问作者Tejas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:45:32