为何修改Pandas DataFrame中的值后,数值仅显示为整数而非小数形式?
为什么修改DataFrame值后小数没显示,变成了整数?
这个问题我之前踩过坑,核心原因很简单:你初始创建的DataFrame列是整数类型,当你往里面塞浮点数时,pandas会自动把浮点数强制转换为整数,直接截断小数部分,所以你看到的都是整数。
具体分析你的代码
你一开始用df['Values'] = range(10,15)创建列,range()生成的是纯整数序列,所以这个列的dtype会被自动设为int64(可以用df.dtypes命令查看验证)。之后你用df['Values'][x]这种链式索引给列赋值浮点数,不仅容易触发SettingWithCopyWarning(一种潜在的不安全操作警告),更关键的是整数类型的列根本存不下浮点数——pandas会默默把浮点数转成整数,比如1.11直接变成1,小数部分自然就没了。
另外提个小细节:你代码最后写的print(test)应该是print(df),不然会报NameError哦。
解决办法
这里给你几个可行的方案,按需选择:
方案1:初始创建时就指定浮点数类型
要么直接用浮点数序列初始化,要么手动把列转成float类型:df = pd.DataFrame() # 方法A:用浮点数列表初始化 df['Values'] = [float(i) for i in range(10,15)] # 方法B:先创建整数列,再转换类型 df['Values'] = range(10,15) df['Values'] = df['Values'].astype(float)方案2:用.loc进行安全赋值(推荐)
链式索引df['Values'][x]属于不安全的赋值方式,改用.loc定位行和列,同时确保列是浮点数类型:df = pd.DataFrame() df['Values'] = range(10,15) # 先转换列类型为float df['Values'] = df['Values'].astype(float) lst = [1.11, 2.22 ,3.33,4.44,5.55] for x in range(0,5): df.loc[x, 'Values'] = lst[x] print(df)方案3:直接用目标列表初始化列(最简洁)
其实你完全可以跳过初始的range步骤,直接把你的浮点数列表赋值给列,这样pandas会自动把列设为float类型:df = pd.DataFrame() lst = [1.11, 2.22 ,3.33,4.44,5.55] df['Values'] = lst print(df)
验证结果
修改后运行代码,你会得到预期的带小数的输出:
Values 0 1.11 1 2.22 2 3.33 3 4.44 4 5.55
内容的提问来源于stack exchange,提问作者Tiago Emanuel Pratas
相关产品推荐
相关产品推荐

