如何在DataFrame中匹配模式时替换整个字符串而非部分内容?
解决DataFrame列包含特定子串时替换整个字符串的问题
原代码的问题在于两点:一是用^限定了仅匹配以目标子串开头的内容,而非任意位置包含子串;二是replace在正则模式下默认只替换匹配到的部分片段,而非整个单元格的字符串。以下是两种可行的解决方法:
方法一:修改正则表达式匹配整个包含子串的字符串
构造能匹配任意位置包含目标子串的整个字符串的正则规则,让replace直接替换整个单元格内容:
import pandas as pd import re # 若字典key包含正则特殊字符(如.、*)则需要 stimuli_dict = {'121': 'mp4', '212': 'mp3'} # 用.*包裹key,实现"包含子串即匹配整个字符串"的效果 # 若key含正则特殊字符,用re.escape(k)转义避免正则语法冲突 stimuli_dict = {r".*{}.*".format(re.escape(k)): v for k, v in stimuli_dict.items()} df['stimulus'] = df['stimulus'].replace(stimuli_dict, regex=True)
方法二:通过筛选赋值实现替换
遍历字典,用str.contains筛选出包含目标子串的行,直接赋值替换整个单元格内容:
import pandas as pd stimuli_dict = {'121': 'mp4', '212': 'mp3'} for key, val in stimuli_dict.items(): # 筛选出stimulus列包含key的行,将对应单元格赋值为val df.loc[df['stimulus'].str.contains(key), 'stimulus'] = val
两种方法对比
- 方法一:代码简洁,但需注意处理正则特殊字符,适合字典key无特殊符号的场景;
- 方法二:逻辑直观,无需处理正则转义,适合key含特殊字符或需要明确控制替换优先级的场景(后遍历的key会覆盖先匹配的结果)。
内容的提问来源于stack exchange,提问作者stasia_l
相关产品推荐
相关产品推荐

