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

如何正确快速将Pandas DataFrame多列从object转为int?

解决Pandas中Object列转Int类型的SettingWithCopyWarning问题

问题根源

你遇到的SettingWithCopyWarning是因为当前操作的df是另一个DataFrame的切片视图,而非独立副本。直接对视图赋值时,Pandas无法确定你是否要修改原始数据,因此抛出警告。

正确转换方法

方法1:先创建独立副本(最稳妥)

先将df转为独立副本,彻底避免视图/副本混淆后再进行类型转换:

cols = ['x1','x2','y1','y2']
# 创建独立副本
df = df.copy()
# 转换为数值类型后转int,errors='coerce'处理非数值内容(转为NaN),fillna按需填充默认值
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce').fillna(0).astype(int)

方法2:使用.loc明确索引赋值

通过.loc[:, cols]明确指定要修改的行和列,消除Pandas的不确定性:

cols = ['x1','x2','y1','y2']
# 用.loc定位列,同时处理非数值情况
df.loc[:, cols] = df.loc[:, cols].apply(pd.to_numeric, errors='coerce').fillna(0).astype(int)

方法3:直接用astype(需确保列中无非法值)

如果确认这4列的object内容都是可直接转换为int的字符串/数值,可简化操作,但同样要结合副本或.loc:

cols = ['x1','x2','y1','y2']
df = df.copy()
df[cols] = df[cols].astype(int)
# 或用.loc方式
df.loc[:, cols] = df.loc[:, cols].astype(int)

注意事项

  • errors='coerce'参数会将无法转换为数值的内容转为NaN,后续需用fillna()填充(比如填0或业务允许的默认值),否则astype(int)会因NaN报错。
  • 如果能保证列中无非法值,可去掉errors='coerce'和fillna(),但遇到非数值内容时会直接抛出转换错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:29:58