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

Pandas加载JSON:将浮点数字段设为4位精度非科学计数法

解决Pandas加载JSON后浮点数显示为科学计数法的问题

嘿,这个问题我之前也踩过坑!先给你明确个关键点:你看到的科学计数法大多是Pandas的默认显示设置搞的鬼,数据本身的精度并没有丢。不过要实现和JSON源文件一致的4位精度常规显示,有两种实用方案:

方案一:先全局设置显示规则,再创建DataFrame

如果你希望所有浮点数列都用4位小数的常规格式显示,不想再看到科学计数法,可以在加载数据前先给Pandas设个全局规则,这样后续生成的所有DataFrame都会遵守这个格式:

import pandas as pd
from pandas import json_normalize
import json

# 全局设置:浮点数显示为4位小数,禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.4f' % x)

with open('myjson.json') as f:
    loaded_file = json.load(f)
df = json_normalize(loaded_file)
print(df['action.time_sec'])
print(df['action.diff'])

运行这段代码后,你打印出来的浮点数就会和JSON里的格式完全一致,比如14.7584、12345.3750这样的常规格式。

方案二:生成DataFrame后,针对特定列调整格式

如果你只想让个别列(比如action.time_sec和action.diff)按4位小数显示,不想影响其他列的默认设置,可以试试这两种方法:

方法A:用style.format做美观打印

适合需要输出整洁格式的场景,比如打印给别人看:

import pandas as pd
from pandas import json_normalize
import json

with open('myjson.json') as f:
    loaded_file = json.load(f)
df = json_normalize(loaded_file)

# 给指定列设置显示格式
styled_df = df.style.format({
    'action.time_sec': '{:.4f}',
    'action.diff': '{:.4f}'
})
print(styled_df.to_string())

方法B:直接转成字符串列(如果不需要数值计算)

要是你之后不需要对这些浮点数做加减乘除之类的运算,可以在加载JSON后先把字段格式化成字符串,再转成DataFrame,这样完全和JSON里的格式一模一样:

import pandas as pd
from pandas import json_normalize
import json

with open('myjson.json') as f:
    loaded_file = json.load(f)

# 遍历数据,把指定浮点数转成4位小数的字符串
for item in loaded_file:
    item['action']['time_sec'] = '{:.4f}'.format(item['action']['time_sec'])
    item['action']['diff'] = '{:.4f}'.format(item['action']['diff'])

df = json_normalize(loaded_file)
print(df['action.time_sec'])
print(df['action.diff'])

额外补充:要不要在创建时就修改存储精度?

你问到能不能在创建DataFrame时就把字段设置成4位精度的浮点数——这里要区分「显示精度」和「存储精度」:

  • 要是只是想显示成4位小数,前面的方案足够了,数据本身还是保留原始精度的;
  • 要是你确实需要存储时就只保留4位精度(比如节省空间或者业务要求),可以在创建后对列做四舍五入:
df = json_normalize(loaded_file)
# 对指定列四舍五入到4位小数
df['action.time_sec'] = df['action.time_sec'].round(4)
df['action.diff'] = df['action.diff'].round(4)
# 再设置显示格式禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.4f' % x)
print(df)

不过一般不建议这么做,因为会丢失原始数据的精度,除非你确定不需要更高精度的数值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:52:30