Pandas 带有 float64 的数据帧被 to_json() 函数错误导出

Pandas dataframe with float64 incorrectly exported by to_json() function

此问题是关于使用 Pandas 中的 to_json() 函数导出具有 float64 数据类型的数据帧。下面附上源码

import pandas

if __name__ == "__main__":
    d = {'col1': [11111111.84, 123456.55], 'col2': [3, 4]}
    df = pandas.DataFrame(data=d)

    print(df)
    print(df.dtypes)

    output_file_path = '/test.csv'
    df.to_csv(output_file_path, index=False, encoding='UTF-8')
    output_file_path = '/test.json'
    df.to_json(output_file_path, orient="records", lines=True)

在将数据帧导出到 JSON 或 CSV 文件之前,print() 函数的输出是正确的。输出如下所示。

          col1  col2
0  11111111.84     3
1    123456.55     4
col1    float64
col2      int64
dtype: object

导出的 CSV 格式数据 (test.csv) 应该是正确的。

JSON 格式 (test.json) 导出的数据有 不正确的 小数点,如下列 col1 row1 (11111111.8399999999)。此问题仅对某些值发生,因为 col1 row2 是正确的 (123456.55).

我发现通过为 to_json() 函数指定另一个参数 double_precision 可以解决此问题。结果变得正确! (已测试。)

参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_json.html

但是,通过指定 double_precision 参数,它可能会限制所有列的小数点数。当每个数据列需要不同数量的小数点时,这不是一个好的方法。

另外,找到了下面的话题,但不确定是否与我的这个问题有关。

Link:

我正在尝试了解此问题的根本原因并寻找解决方案。这很奇怪,这个问题只发生在 to_json() 函数上,但 to_csv() 函数有效。

请大家帮忙!

pandas to_json 可能在精确度上做了一些奇怪的事情。正如您所解释的,规范的解决方案是指定 double_precision 您想要的精度,但这不允许您有选择地将 specific 列舍入到所需的精度。

另一种选择是在此处切断中间人 df.to_json,而是使用 python 的内置 json.dump:

import json

# convert to string
json.dumps(df.to_dict()) 
# '{"col1": {"0": 11111111.84, "1": 123456.55}, "col2": {"0": 3, "1": 4}}'  

# save as a file
json.dump(df.to_dict(), f)  # f is an open fileobj

如您所见,这不会影响精度。 Standard floating point caveats 仍然适用。