【问题标题】:ast.literal_eval() method truncates float value while converting str to dictast.literal_eval() 方法在将 str 转换为 dict 时截断浮点值
【发布时间】:2014-07-06 11:26:36
【问题描述】:

这里我正在尝试使用 ast 模块将 dict 转换为字符串。我发现这些值被截断,如下面的输出所示。我怎样才能在这里得到一个不被截断的实际值。

代码

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'}}

【问题讨论】:

  • str(mapping) 调用 截断值,而不是 ast.literal_eval() 解析(它实际上只是 Python 语法解析器产生一个抽象解析树,即然后用于生成 Python 值)。你想做什么;序列化数据?有更好的格式。
  • 我不认为str(mapping) 调用会截断我检查过的值。
  • ast.literal_eval() 解释字符串与在 Python 代码中解释浮点字面量时完全相同。它不会截断任何内容。另一方面,字典上的str() 会触发repr() 对浮点值的调用,这肯定确实简化了浮点值。
  • 但是你忽略了我的问题。 你想做什么,真的
  • 我正在尝试使用密钥加密数据帧的所有浮点值。我正在尝试一种加密,它将数字字符串作为数字文本的密码。简而言之,我试图将数据帧作为加密数据帧的诱饵

标签: python string pandas


【解决方案1】:

区别只是类型,而不是值。 numpy.float64 通常使用比在打印上表示浮点数所需的精度更高的精度,并准确地表示它。 Python 的 float 类型提供了在转换为浮点数时正确舍入值所需的最高精度。

如果您希望它成为原始字典,则必须将浮点数转换为 numpy.float64s。

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

【讨论】:

    【解决方案2】:

    您可以使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-30
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多