gpt4 book ai didi

python - Pandas to_dict 不希望地修改 float

转载 作者:太空狗 更新时间:2023-10-29 21:09:37 27 4
gpt4 key购买 nike

我下面的代码接收 CSV 数据,并使用 pandas to_dict() 函数作为将数据转换为 JSON 的一个步骤。 问题是它正在修改 float (例如 1.6 变成 1.6000000000000001)。我不担心准确性的损失,但因为用户会看到数字的变化,所以看起来很业余。 p>

我知道:

  • 这是在 here 之前出现的问题,但那是两年前的事了,并没有得到很好的回答,
  • 我还有一个额外的复杂问题:我希望转换为字典的数据框可以是数据类型的任意组合

因此,以前的解决方案存在的问题是:

  1. 仅当您不需要(以数字方式)使用数字时,将所有数字转换为对象才有效。我想要计算总和和平均值的选项,这会重新引入加法小数问题。
  2. 强制将数字四舍五入为 x 位小数将降低准确性或添加额外的不必要的 0,具体取决于用户提供的数据

我的问题:

有没有更好的方法来确保数字不被修改,而是保留在数字数据类型中?首先是更改我导入 CSV 数据的方式的问题吗?我肯定忽略了一个简单的解决方案?

这是一个可以重现此错误的简单脚本:

import pandas as pd

import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO

CSV_Data = "Index,Column_1,Column_2,Column_3,Column_4,Column_5,Column_6,Column_7,Column_8\nindex_1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\nindex_2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8\nindex_3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8\nindex_4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8"

input_data = StringIO(CSV_Data)
df = pd.DataFrame.from_csv(path = input_data, header = 0, sep=',', index_col=0, encoding='utf-8')
print(df.to_dict(orient = 'records'))

最佳答案

您可以使用 pd.io.json.dumps 来处理带有 pandas 对象的嵌套字典。

让我们创建一个包含数据帧记录和自定义指标的summary 字典。

In [137]: summary = {'df': df.to_dict(orient = 'records'), 'df_metric': df.sum() / df.min()}

In [138]: summary['df_metric']
Out[138]:
Column_1 9.454545
Column_2 9.000000
Column_3 8.615385
Column_4 8.285714
Column_5 8.000000
Column_6 7.750000
Column_7 7.529412
Column_8 7.333333
dtype: float64

In [139]: pd.io.json.dumps(summary)
Out[139]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":{"Column_1":9.4545454545,"Column_2":9.0,"Column_3":8.6153846154,"Column_4":8.2857142857,"Column_5":8.0,"Column_6":7.75,"Column_7":7.5294117647,"Column_8":7.3333333333}}'

使用 double_precision 改变 double 的最大数字精度。注意。 df_metric 值。

In [140]: pd.io.json.dumps(summary, double_precision=2)
Out[140]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":{"Column_1":9.45,"Column_2":9.0,"Column_3":8.62,"Column_4":8.29,"Column_5":8.0,"Column_6":7.75,"Column_7":7.53,"Column_8":7.33}}'

您可以使用 orient='records/index/..' 来处理数据帧 -> to_json 构造。

In [144]: pd.io.json.dumps(summary, orient='records')
Out[144]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":[9.4545454545,9.0,8.6153846154,8.2857142857,8.0,7.75,7.5294117647,7.3333333333]}'

本质上,pd.io.json.dumps - 将任意对象递归转换为 JSON,内部使用 ultrajson

关于python - Pandas to_dict 不希望地修改 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36695359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com