如何高效替换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
相关产品推荐
相关产品推荐

