DataFrame.round()方法失效,如何将指定列向下取整至3位小数?
解决Pandas中Object类型列无法执行小数取整的问题
嘿,问题的核心就在这儿——你所有的列都是object(字符串)类型!Pandas的round()方法只对数值类型(int或float)的列生效,直接调用它对字符串列完全不起作用,这就是你试了两次都没看到变化的原因。
咱们一步一步来搞定这个问题:
1. 先明确要处理的目标列
先把需要取整的列名整理出来,对应你的数据就是:
cols_to_round = ['Unnamed: 26', 'Unnamed: 27', 'Unnamed: 30', 'Unnamed: 31', 'Unnamed: 34']
2. 将字符串列转换为数值类型
首先得把这些看起来像数字的字符串转换成真正的浮点型,用pd.to_numeric()处理最稳妥:
# 如果你想直接修改原df1 df1[cols_to_round] = df1[cols_to_round].apply(pd.to_numeric, errors='coerce') # 或者想生成新的df2,避免改动原数据 df2 = df1.copy() df2[cols_to_round] = df2[cols_to_round].apply(pd.to_numeric, errors='coerce')
errors='coerce'是个保险选项,如果遇到无法转换的异常值会自动变成NaN,你的数据样例里都是合法数值,完全不用担心。
3. 执行小数取整操作
现在这些列已经是数值类型了,就可以正常用round(3)来取整到3位小数:
# 修改原df1的情况 df1[cols_to_round] = df1[cols_to_round].round(3) # 生成df2的情况 df2[cols_to_round] = df2[cols_to_round].round(3)
可选:如果需要转回Object类型
要是你必须保持列的object类型结构,取整后可以再转回去:
df2[cols_to_round] = df2[cols_to_round].astype(str)
最后你可以用df2.info()验证一下,目标列应该已经变成float64类型(如果没转回字符串的话),查看数据也能看到已经是保留3位小数的数值了。
顺便解释下你之前尝试无效的原因:
df1.round(3):因为列是字符串,Pandas不会自动转换类型执行取整,所以毫无变化- 指定列列表创建新DataFrame:只是复制了原数据的列,没有做任何类型转换和取整操作,结果自然和原数据一致
内容的提问来源于stack exchange,提问作者shoggananna
相关产品推荐
相关产品推荐

