如何正确快速将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
相关产品推荐
相关产品推荐

