使用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
相关产品推荐
相关产品推荐

