Python介绍嵌套 JSON 秒变 Dataframe!

1. 嵌套JSON介绍

在现代计算机系统中,大多数应用程序都是通过使用REST API或其他Web服务接口来访问和操作远程服务的数据。而这些服务返回的数据通常以JSON格式进行编码。

JSON是一种轻量级数据格式,易于阅读和写入。其通常采用键/值对来表示数据,但也支持按顺序的数组。同时,它是一种自描述的数据格式,允许利用它来表示结构化数据(例如树形结构)。

如下是一段JSON格式的代码示例:

{

"name": "John Smith",

"age": 32,

"address": {

"street": "123 Main St",

"city": "Anytown",

"state": "CA",

"zip": "12345-6789"

},

"phoneNumbers": [

{

"type": "home",

"number": "555-555-1212"

},

{

"type": "work",

"number": "555-555-1213"

}

]

}

2. Python处理嵌套JSON

2.1 使用Python内置库

Python自带了处理JSON的标准库json,使用它可以将JSON字符串转换为Python中的dict(字典)对象。例如,我们可以将上述JSON代码转换为Python dict对象:

import json

data = '''

{

"name": "John Smith",

"age": 32,

"address": {

"street": "123 Main St",

"city": "Anytown",

"state": "CA",

"zip": "12345-6789"

},

"phoneNumbers": [

{

"type": "home",

"number": "555-555-1212"

},

{

"type": "work",

"number": "555-555-1213"

}

]

}

'''

json_data = json.loads(data)

print(type(json_data))

我们使用了Python的内置json库将JSON代码转换为Python dict对象,并使用type()函数确认对象类型为dict(字典)。

2.2 转换为Pandas Dataframe

有时候,我们需要将嵌套JSON数据转换为Pandas的Dataframe对象以进行数据分析和可视化。下面我们将使用pandas.read_json()函数将转换后的JSON数据转换为Dataframe对象。

import pandas as pd

df = pd.read_json(data)

print(df)

我们可以看到,输出的结果是一个表格,每一列的名称和数据类型都被自动推断为与JSON格式相一致。

2.3 处理嵌套JSON数据

但是,当JSON数据嵌套层数太多时,直接将JSON转换为Dataframe对象可能会导致数据丢失或其他问题。这时,我们需要采用其他方法进行处理。

例如,考虑如下JSON数据:

{

"name": "John Smith",

"age": 32,

"address": {

"street": "123 Main St",

"city": "Anytown",

"state": "CA",

"zip": "12345-6789"

},

"phoneNumbers": [

{

"type": "home",

"number": "555-555-1212"

},

{

"type": "work",

"number": "555-555-1213"

}

],

"hobbies": [

{

"outdoor": [

"hiking",

"biking"

]

},

{

"indoor": [

"reading",

"cooking"

]

}

]

}

这个嵌套JSON数据包含了多层嵌套,其中包含了一个名为"hobbies"的列表,这个列表又包含了多个嵌套的字典。

我们可以使用Pandas的json_normalize()函数将嵌套的JSON结构转换为扁平化的Dataframe对象。需要注意的是,这个函数只能用于嵌套的结构层次不深的情况,一般是一层或两层嵌套。

from pandas.io.json import json_normalize

flat_data = json_normalize(json_data, 'hobbies', ['name', 'age'], record_prefix='hobby_')

print(flat_data)

这样,所有的嵌套结构都被转换为了Dataframe对象的一个列。同时,我们保留了原始JSON结构中的所有数据和元数据。

2.4 转换为多个Dataframe

还有一种情况是,JSON结构中包含多个列表和嵌套结构。这时,我们可以通过一些不同的方法来处理。

一个比较通用的方法是,将原始JSON数据转换为具有多个Dataframe的Python对象,并更改这些对象以符合所需的格式。

例如,考虑如下JSON数据:

{

"users": [

{

"name": "John Smith",

"age": 32,

"address": {

"street": "123 Main St",

"city": "Anytown",

"state": "CA",

"zip": "12345-6789"

}

},

{

"name": "Paul Brown",

"age": 45,

"address": {

"street": "456 Elm St",

"city": "Othertown",

"state": "CA",

"zip": "12345-6789"

}

}

],

"hobbies": [

{

"user": "John Smith",

"hobbies": [

"hiking",

"biking"

]

},

{

"user": "Paul Brown",

"hobbies": [

"reading",

"cooking"

]

}

]

}

这个JSON数据包含了两个列表和多个嵌套结构。我们可以使用Python来处理此类数据。

user_data = pd.DataFrame(json_data['users'])

hobby_data = json_normalize(json_data['hobbies'], 'hobbies', ['user'], record_prefix='hobby_')

print(user_data)

print(hobby_data)

通过将两个JSON结构分别转换为Dataframe对象,我们现在可以方便地将它们合并为一个更完整的数据集。

3. 总结

使用Python处理嵌套JSON数据可以更轻松地分析和可视化数据。通过Python内置库和Pandas库,我们可以轻松地将JSON数据转换为Python字典和Dataframe对象。如果JSON数据包含多个嵌套结构或列表,则可能需要一些特殊的处理方式,例如使用json_normalize()函数或转换为多个Dataframe对象。

后端开发标签