a_g*_*est 7 python floating-point json pandas
我观察到以下行为DataFrame.to_json:
>>> df = pd.DataFrame([[eval(f'1.12345e-{i}') for i in range(8, 20)]])
>>> df
0 1 2 3 4 5 6 7 8 9 10 11
0 1.123450e-08 1.123450e-09 1.123450e-10 1.123450e-11 1.123450e-12 1.123450e-13 1.123450e-14 1.123450e-15 1.123450e-16 1.123450e-17 1.123450e-18 1.123450e-19
>>> print(df.to_json(indent=2, orient='index'))
{
"0":{
"0":0.0000000112,
"1":0.0000000011,
"2":0.0000000001,
"3":0.0,
"4":0.0,
"5":0.0,
"6":0.0,
"7":0.0,
"8":1.12345e-16,
"9":1.12345e-17,
"10":1.12345e-18,
"11":1.12345e-19
}
}
Run Code Online (Sandbox Code Playgroud)
因此,所有数字似乎1e-16都四舍五入到小数点后 10 位(与 的默认值一致double_precision),但所有较小的值都被精确表示。为什么会出现这种情况?如何关闭较大值的小数舍入(即改用科学记数法)?
>>> pd.__version__
'1.3.1'
Run Code Online (Sandbox Code Playgroud)
作为参考,标准库的json模块不会这样做:
>>> import json
>>> print(json.dumps([eval(f'1.12345e-{i}') for i in range(8, 20)], indent=2))
[
1.12345e-08,
1.12345e-09,
1.12345e-10,
1.12345e-11,
1.12345e-12,
1.12345e-13,
1.12345e-14,
1.12345e-15,
1.12345e-16,
1.12345e-17,
1.12345e-18,
1.12345e-19
]
Run Code Online (Sandbox Code Playgroud)
小智 1
我不确定是否可以使用pd.DataFrame.to_json实现此目的,但我们可以使用pd.DataFrame.to_dict、json和pd.read_json从 pandas 数据帧实现全精度 json 表示。
json_df = json.dumps(df.to_dict('index'), indent=2)
>>> print(json_df)
{
"0": {
"0": 1.12345e-08,
"1": 1.12345e-09,
"2": 1.12345e-10,
"3": 1.12345e-11,
"4": 1.12345e-12,
"5": 1.12345e-13,
"6": 1.12345e-14,
"7": 1.12345e-15,
"8": 1.12345e-16,
"9": 1.12345e-17,
"10": 1.12345e-18,
"11": 1.12345e-19
}
}
Run Code Online (Sandbox Code Playgroud)
要读回它,我们可以这样做:
>>> pd.read_json(json_df, orient='index')
0 1 2 ... 9 10 11
0 1.123450e-08 1.123450e-09 1.123450e-10 ... 1.123450e-17 1.123450e-18 1.123450e-19
[1 rows x 12 columns]
Run Code Online (Sandbox Code Playgroud)