【问题标题】:pands.read_json dtype object to integer/numericspandas.read_json dtype 对象到整数/数字
【发布时间】:2019-12-12 02:05:47
【问题描述】:

我正在尝试将 JSON 字符串转换为 pandas 数据框。虽然pandas.read_json 可以在没有“缺失值”的情况下推断数据类型(如空白或“NA”),但如果值中有空白,它将将该列分类为 dtype object

例如:

d1 = {"a":"1","b":"2"}
d2 = {"a":"","b":""}
l = [d1,d2]
l_js = json.dumps(l)
d = pd.read_json(l_js)
d.dtypes

它将为两个列/字典对象返回 dtype 对象。

我想知道是否有一种有效的方法可以做到这一点,而不必遍历列表中的每个字典。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    pd.read_json() 函数中似乎没有特定的参数来处理这种情况,因为字典 d2 的值是 ''。但是,在这种特殊情况下,这可以通过 replace 后跟一个将列转换为浮点数的循环来处理。

    import pandas as pd
    import json
    import numpy as np
    d1 = {"a":"1","b":"2"}
    d2 = {"a":"","b":""}
    l = [d1,d2]
    l_js = json.dumps(l)
    d = pd.read_json(l_js).replace('',np.nan)
    for i in d:
        d[i] = d[i].astype(float)
    print(d.dtypes)
    

    输出:

    a    float64
    b    float64
    dtype: object
    

    当然,如果您不确定是否所有列都应该是浮动的,或者某些列是否可以作为对象,那么您可以简单地在for 之后添加一个try/except

    import pandas as pd
    import json
    import numpy as np
    d1 = {"a":"1","b":"2","c":"aaa"}
    d2 = {"a":"","b":"","c":"ccc"}
    l = [d1,d2]
    l_js = json.dumps(l)
    d = pd.read_json(l_js).replace('',np.nan)
    for i in d:
        try:
            d[i] = d[i].astype(float)
        except ValueError:
            pass
    print(d.dtypes)
    

    输出:

    a    float64
    b    float64
    c     object
    dtype: object
    

    【讨论】:

      【解决方案2】:

      原来,对于pandas.read_json,它要求该部分的字符串为空,如下所示: '[{"a": "1", "b": "2"}, {"a": null, "b": null}, {"a": null, "b": null}]'

      为此,您可以将“”的字符串部分替换为'null:

      l_js.replace('""','null')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多