如何将熊猫数据框转换为嵌套的JSON对象?

时间:2019-11-14 09:15:35

标签: python json pandas

我有一个需要提取并转换为JSON的SQL数据库。我认为要做的第一步是从数据库中获取数据并将其作为数据框加载,然后将数据框转换为JSON对象。

假设我有以下数据框。

df_school = pd.DataFrame({'id':[1,2,3,4], 'school_code': ['ABC', 'IJK', 'QRS', 'XYZ'], 'name': ['School A','School B', 'School C', 'School D'], 'type':['private', 'public', 'public', 'private']})
print(df_school)

我想用以下代码将其转换为JSON。

import collections

object_list =[]
for idx, row in df_school.iterrows():
    d = collections.OrderedDict()
    d['id'] = row['id']
    d['school_code'] = row['school_code']
    d['name'] = row['name']
    d['type'] = row['type']
    object_list.append(d)

j = json.dumps(object_list)
object_list = 'school_objects.js'
f = open(object_list, 'w')
print(j)

但是结果是字符串。它只看起来像JSON,但是当我尝试访问所谓的JSON中的项目时,例如j[0],它打印的是[,而不是JSON中的项目。

我还尝试了另一种方法,将结果直接从SQL转换为JSON。

query = "Select * from school;"
df_school = pd.read_sql_query(query, connection)
json_school = df_school.head(10).to_json(orient='records')

但是我仍然有字符串。

如何将其转换为真实的JSON对象?

5 个答案:

答案 0 :(得分:2)

鉴于提供的df_school变量,我们只需执行j=df_school.to_json(orient='records')即可将其转换为JSON格式的字符串。

一旦我们保存了j的JSON格式的字符串,如果要对其进行处理,我们首先必须使用json.loads(j)将JSON再次加载到Python中。 因此,如果我们这样做:

j = df_school.to_json(orient='records')
# parse j into Python
loaded_json = json.loads(j)
print(loaded_json[0])
# print outputs: {'id': 1, 'name': 'School A', 'school_code': 'ABC', 'type': 'private'}

希望这会有所帮助!

答案 1 :(得分:1)

import pandas as pd
import json
df_school = pd.DataFrame({'id':[1,2,3,4], 'school_code': ['ABC', 'IJK', 'QRS', 'XYZ'], 'name': ['School A','School B', 'School C', 'School D'], 'type':['private', 'public', 'public', 'private']})
str_school = df_school.to_json(orient='records')
json_school = json.loads(str_school)
json_school[0]

{'id':1,'school_code':'ABC','name':'学校A','type':'私人'}

答案 2 :(得分:0)

JSON是对象的字符串编码。

一旦使用json.dumps()或类似名称,您将得到一个字符串。

答案 3 :(得分:0)

尝试以下代码,希望对您有所帮助:

data = [{columns:df_school.iloc[i][columns] for columns in list(df_school.columns)  }  for i in range(df_school.shape[0])   ]

print(data)
print("***********************")
print(type(data[0]))

输出将会是:

[{'id': 1, 'school_code': 'ABC', 'name': 'School A', 'type': 'private'},
 {'id': 2, 'school_code': 'IJK', 'name': 'School B', 'type': 'public'},
 {'id': 3, 'school_code': 'QRS', 'name': 'School C', 'type': 'public'},
 {'id': 4, 'school_code': 'XYZ', 'name': 'School D', 'type': 'private'}]

*************************
<class 'dict'>

答案 4 :(得分:0)

data={k:list(v.values()) for k,v in df_school.to_dict().items()}
{
'id': [1, 2, 3, 4],
'school_code': ['ABC', 'IJK', 'QRS', 'XYZ'],
'name': ['School A', 'School B', 'School C', 'School D'],
'type': ['private', 'public', 'public', 'private']
}