使用pandas搭配正则处理负号错位时无法修改value列的问题
问题根源
原有代码未生效是两个核心错误导致的:
- 正则方法用错:
re.match()默认从字符串起始位置开始匹配,你的负号在name字段末尾,该方法永远无法命中规则,if判断块从未执行,自然不会改动数据也不会抛出报错。 - 赋值逻辑错误:就算正则命中规则,你直接对
diference["value"]整列赋值,会修改所有行的value值,而非仅修改负号错位的对应行。另外你的value列是带逗号的字符串格式,直接做乘法运算会触发类型错误。
可直接运行的实现方案
优先用pandas原生向量化操作,无需写for循环逐行遍历,运行效率更高:
# 1. 生成匹配掩码:筛选name字段末尾带负号的行,自动忽略字段首尾多余空格干扰 match_mask = diference["name"].str.strip().str.endswith("-") # 2. 仅对命中规则的行,在value字段前拼接负号 diference.loc[match_mask, "value"] = "-" + diference.loc[match_mask, "value"]
如果需要兼容负号前后存在不定量空格的场景,也可以用正则实现匹配逻辑:
import re # 正则规则:匹配字符串末尾的负号,兼容负号前任意数量空白字符 pattern = re.compile(r"-\s*$") match_mask = diference["name"].apply(lambda x: bool(pattern.search(x.strip()))) diference.loc[match_mask, "value"] = "-" + diference.loc[match_mask, "value"]
可选后续处理:如果需要对value列做数值计算,可以把欧洲格式的数字字符串转成浮点型:
diference["value"] = diference["value"].str.replace(".", "", regex=False)\ .str.replace(",", ".", regex=False)\ .astype(float)
运行后即可得到预期结果,错位的负号会被正确补到对应value值的前面。
内容的提问来源于stack exchange,提问作者João Pedro
相关产品推荐
相关产品推荐

