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

