为何同一Pandas脚本在两台机器上一台显示警告一台不显示?
已知条件:两台机器均使用PyCharm,Pandas包版本、Windows系统版本一致,执行以下脚本时,搭档触发警告,你未触发:
for inncode in all_properties['inncode'].unique(): star_data['inncode'] = inncode
触发的警告内容:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer, col_indexer] = value instead
排除已知差异后,可能的原因如下:
Pandas 自身警告开关配置不同
Pandas通过pd.options.mode.chained_assignment控制该警告的显示,可选值为'warn'(默认,显示警告)、'raise'(抛出错误)、'none'(隐藏警告)。你的机器可能被设置为'none',可以在脚本开头执行print(pd.options.mode.chained_assignment)验证当前配置。PyCharm 的警告过滤规则差异
PyCharm可能单独过滤了该警告:- 检查「设置/偏好 → 编辑器 → 检查 → Python → Pandas」中,是否禁用了"Chained assignment"相关检查;
- 查看「运行/调试配置」中是否添加了忽略警告的启动参数,比如
-W ignore::UserWarning; - 确认是否在PyCharm的警告级别设置中,将该类警告设为隐藏。
star_data的创建方式存在隐性区别
虽然脚本片段相同,但star_data的来源可能不同:如果你的star_data是直接新建的DataFrame(而非从其他DataFrame切片得到的副本/视图),Pandas不会触发警告;而搭档的star_data可能是通过df[cols]或未显式复制的切片操作得到的对象,属于Pandas判定的"副本风险"场景,因此触发警告。可以在循环前执行print(star_data._is_view)判断是否为视图对象(返回True则说明是视图,易触发警告)。Python 全局警告模块的配置差异
你的Python环境可能通过warnings模块全局忽略了该类警告,比如执行过warnings.filterwarnings("ignore", category=UserWarning)(SettingWithCopyWarning属于UserWarning的子类)。可以在脚本开头添加import warnings; print(warnings.filters)查看当前的警告过滤规则。PyCharm 实际使用的解释器不一致
即使你们确认了包版本,也可能实际使用的Python解释器路径不同(比如一个用项目虚拟环境,一个用全局环境),导致隐性配置差异。可以在PyCharm中查看「文件 → 设置 → 项目: [项目名] → Python解释器」,确认双方的解释器路径完全一致。
内容的提问来源于stack exchange,提问作者Jake Thorson

