Pandas Series.replace正则替换异常:精确匹配需求未满足求助
Pandas Series.replace 实现不区分大小写完全匹配替换并正确处理小数后缀
你遇到的问题是因为正则没加锚点导致了部分匹配,比如'A true warrior'里的'true'子串被误匹配替换。要实现你的需求,得把正则改成完全匹配的模式,同时单独处理小数后缀的替换逻辑:
解决方案代码
import pandas as pd # 定义替换规则:分两类处理,避免互相干扰 replace_rules = [ # 不区分大小写,仅完全匹配True/Yes/False时替换 (r'^(?i)true$', 1), (r'^(?i)yes$', 1), (r'^(?i)false$', 0), # 仅匹配完整的"数字+.0+"格式字符串,保留数字部分 (r'^(\d+)\.0+$', r'\1') ] df = pd.DataFrame(data=['true', 'TRue','False', 'Yes', '2.0', '2.0000', '.0002', 'A true warrior'], columns=['col_a']) # 逐个应用替换规则 df['col_b'] = df['col_a'] for pattern, repl in replace_rules: df['col_b'] = df['col_b'].replace(to_replace=pattern, value=repl, regex=True) print(df)
输出结果
col_a col_b 0 true 1 1 TRue 1 2 False 0 3 Yes 1 4 2.0 2 5 2.0000 2 6 .0002 .0002 7 A true warrior A true warrior
关键说明
^(?i)true$里的^和$是字符串开头/结尾锚点,确保只有整个字符串是true(不区分大小写)才会被替换,彻底避免部分匹配^(\d+)\.0+$专门匹配2.0、2.0000这类完整字符串,通过捕获组\1提取前面的数字,替换掉末尾的.0系列后缀,不会影响.0002这类不符合格式的字符串- 分规则依次替换,先处理布尔值再处理小数,避免规则间互相干扰
内容的提问来源于stack exchange,提问作者rams
相关产品推荐
相关产品推荐

