我正在尝试将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对象。
我想知道是否存在一种有效的方法,而不必遍历列表中的每个字典。
答案 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')