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

使用df.loc修改Pandas数据触发UserWarning的解决方法

你的问题拆解与优化方案

嘿,先给你吃个定心丸:你的代码功能完全没问题,确实能把checker字段以CD结尾的行的data改成900!那个警告只是Pandas在提醒你:你用了正则捕获组,但str.contains并不需要捕获分组内容,如果你是想提取分组的话应该用str.extract。

先解决警告问题

警告的根源是你正则里的(CD)——这是一个捕获组,但我们只是要判断是否匹配,不需要提取这个部分。有两种简单的方式消除警告:

方式1:去掉多余的括号

既然不需要捕获CD,直接把括号删掉就行:

df.loc[df.checker.str.contains(r"\d+\w*CD$"), "data"] = "900"

方式2:用非捕获组(如果需要保留括号结构)

要是你后续可能调整正则,想保留括号的层级,可以用非捕获组(?:...),告诉Pandas“我只是分组,不是要提取内容”:

df.loc[df.checker.str.contains(r"\d+\w*(?:CD)$"), "data"] = "900"

更优的实现方式:别用正则啦!

其实你的需求本质就是匹配checker以CD结尾的行,完全没必要用正则,Pandas的str.endswith方法更简单高效,代码可读性也更强:

df.loc[df.checker.str.endswith("CD"), "data"] = "900"

这个方法既不会触发任何警告,运行速度也比正则匹配快,因为它是直接做字符串后缀匹配,不需要正则引擎处理。

验证一下结果

不管用上面哪种方法,运行后都会得到你想要的输出:

name    checker data
0  user1  user122AB   10
1  user2  user132AB   12
2  user3  user346AB   14
3  user4  user108AB   16
4  user5  user122CD  900
5  user6  user132CD  900
6  user7  user346CD  900
7  user8  user108CD  900

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:12:41