pands.read_json dtype对象转换为整数/数值

时间:2019-12-11 17:33:05

标签: python pandas

我正在尝试将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对象。

我想知道是否存在一种有效的方法,而不必遍历列表中的每个字典。

2 个答案:

答案 0 :(得分:0)

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

当然,如果不确定所有列是否应为浮点数,或者某些列是否可以作为对象,则可以在try之后简单地添加except / for

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

答案 1 :(得分:0)

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

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

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