ast.literal_eval() 方法在将字符串转换为字典时截断浮点值

0 投票
2 回答
1499 浏览
提问于 2025-04-18 06:54

在这里,我想用 ast 模块把字典转换成字符串。我发现输出的值被截断了,如下所示。请问我该如何获取没有被截断的实际值呢?

代码

df = DataFrame({
            'a': np.random.randn(6),
            'b':['foo','bar']*3,
            'c':np.random.randn(6)
            })
mapping = df.to_dict() 
d=str(mapping)
e= ast.literal_eval(d)
print mapping
print;print e

输出

{'a': {0: 0.88241526852727104, 1: -0.062779346232699929, 2: -0.058427377402568821, 3: 0.87157579927705897, 4: -1.0399255501591143, 5: 0.11203584043469664}, 'c': {0: 0.56763771194925394, 1: 0.22824054879261255, 2: -0.58324477854217549, 3: -0.2264734421572463, 4: 0.45754374820401839, 5: 1.35849692636584}, 'b': {0: 'foo', 1: 'bar', 2: 'foo', 3: 'bar', 4: 'foo', 5: 'bar'}}

{'a': {0: 0.882415268527271, 1: -0.06277934623269993, 2: -0.05842737740256882, 3: 0.871575799277059, 4: -1.0399255501591143, 5: 0.11203584043469664}, 'c': {0: 0.5676377119492539, 1: 0.22824054879261255, 2: -0.5832447785421755, 3: -0.2264734421572463, 4: 0.4575437482040184, 5: 1.35849692636584}, 'b': {0: 'foo', 1: 'bar', 2: 'foo', 3: 'bar', 4: 'foo', 5: 'bar'}}

2 个回答

0

你可以使用simplejson来指定数据类型:

mapping = df.to_dict()
import simplejson as json
a_str = json.dumps(mapping)
a_dict=json.loads(a_str,parse_float=np.float64)

输出结果应该和这个匹配。

simplejson

1

它们之间的区别其实就是类型,而不是数值。numpy.float64 通常使用的精度比打印时需要的要高,而且它能准确地表示数值。Python 的 float 类型则提供了转换为浮点数时所需的最大精度,以确保数值四舍五入正确。

如果你想保持原来的字典格式,就需要把浮点数转换成 numpy.float64 类型。

type(DataFrame({0: [0.88241526852727104]}).to_dict()[0][0])
#>>> <class 'numpy.float64'>
float64(0.882415268527271)
#>>> 0.88241526852727104

float64(0.88241526852727104)
#>>> 0.88241526852727104

0.88241526852727104
#>>> 0.882415268527271

float64(0.88241526852727104) == 0.88241526852727104
#>>> True

float(float64(0.88241526852727104)) == 0.88241526852727104
#>>> True

撰写回答