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

使用pandas的.astype()转换数据类型时触发赋值警告,求解决方案

解决Pandas "SettingWithCopyWarning" 警告

问题原因

你写的new_df = df根本没创建新DataFrame,只是给原df加了个别名——new_df和df指向同一个数据对象。这时候改new_df的列,本质是在改原df的列,Pandas触发警告是怕你误操作原数据。

另外你尝试修改的代码new_df[i] = df.loc[df[i].astype(int)]是错误的:.loc的第一个参数需要传入行索引,而df[i].astype(int)是列的数值,不是合法的行索引,会导致索引匹配错误。

修复方法

第一步:先做深拷贝

用copy()方法生成完全独立的新DataFrame,彻底和原数据解绑:

df = pd.DataFrame(data)
# 创建独立的新DataFrame,和原df互不影响
new_df = df.copy()

第二步:修改列类型(两种可选写法)

写法1:直接修改拷贝后的列

循环里直接操作new_df的列,因为已经是独立拷贝,不会触发警告:

bools = ['ind-debateclub', 'ind-programming_exp', 
'ind-international_exp',
'ind-entrepeneur_exp', 'ind-exact_study', 'decision']

for i in bools:
    new_df[i] = new_df[i].astype(int)
new_df.head()

写法2:用.loc明确指定行列(完全符合警告提示的规范)

如果你想严格遵循Pandas的建议,用.loc明确指定要修改的行列范围:

for i in bools:
    new_df.loc[:, i] = new_df[i].astype(int)

更高效的批量写法(不用循环)

直接批量转换指定列的类型,代码更简洁:

new_df = df.copy()
new_df[bools] = new_df[bools].astype(int)
new_df.head()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:00:58