Python Pandas – 扁平化嵌套的JSON

Python Pandas – 扁平化嵌套的JSON

通过搜刮从网络上提取的大部分数据都是JSON数据类型,因为JSON是网络应用中传输数据的首选数据类型。之所以首选JSON,是因为它在HTTP请求和响应中来回发送时非常轻巧,因为文件大小很小。

这样的JSON文件有时会很笨拙,有不同的级别和层次。这种原始格式的数据不能用于进一步处理。一般的做法是将JSON数据结构转换为Pandas Dataframe,因为它可以帮助我们更方便地操作和可视化数据。在这篇文章中,让我们考虑不同的嵌套JSON数据结构,并使用内置的和自定义的函数对它们进行扁平化。

Pandas有一个很好的内置函数,叫做json_normalize(),可以将简单到中等程度的半结构化的嵌套JSON结构平铺到平面表格。

语法:

pandas.json_normalize(data, errors=’raise’, sep=’.’, max_level=None)

参数:

  • data – dict或dict的列表
  • errors- {‘提高’,’忽略’},默认’提高’。
  • sep – str,默认为’.’,嵌套记录将产生由指定分隔符分隔的名称。
  • max_level – int, default None.归一化的最大级别数(dict的深度)。

示例 1:

考虑一个嵌套字典的列表,其中包含了关于学生和他们的分数的详细信息,如图所示。在这个JSON数据结构上使用pandas json_normalize,将其扁平化为一个平面表,如图所示

import pandas as pd
  
data = [
    {"Roll no": 1,
     "student": {"first_name": "Ram", "last_name": "kumar"}
     },
    {"student": {"English": "95", "Math": "88"}
     },
    {"Roll no": 2,
     "student": {"first_name": "Joseph", "English": "90", "Science": "82"}
     },
    {"Roll no": 3,
     "student": {"first_name": "abinaya", "last_name": "devi"},
     "student": {"English": "91", "Math": "98"}
     },
]
  
df = pd.json_normalize(data)
print(df)

输出:

Python Pandas - 扁平化嵌套的JSON

示例 2:

现在让我们利用max_level选项,将一个稍微复杂的JSON结构平铺到一个平面表。在这个例子中,我们考虑了max_level为0,这意味着只对JSON的第一层进行扁平化,并可以对结果进行实验。

在这里,我们考虑了一个JSON格式的不同个人的健康记录的例子。

import pandas as pd
  
data = [
    {
        "id": 1,
        "candidate": "Roberto mathews",
        "health_index": {"bmi": 22, "blood_pressure": 130},
    },
    {"candidate": "Shane wade", "health_index": {"bmi": 28, "blood_pressure": 160}},
    {
        "id": 2,
        "candidate": "Bruce tommy",
        "health_index": {"bmi": 31, "blood_pressure": 190},
    },
]
pd.json_normalize(data, max_level=0)

输出:

由于我们只使用了1级扁平化,第二级被保留为一个键值对,如图所示

Python Pandas - 扁平化嵌套的JSON

示例 3:

现在让我们使用与上面相同的JSON数据结构,max_level为1,这意味着将JSON的前两层扁平化,可以对结果进行实验。

import pandas as pd
  
data = [
    {
        "id": 1,
        "candidate": "Roberto mathews",
        "health_index": {"bmi": 22, "blood_pressure": 130},
    },
    {"candidate": "Shane wade", "health_index": {"bmi": 28, "blood_pressure": 160}},
    {
        "id": 2,
        "candidate": "Bruce tommy",
        "health_index": {"bmi": 31, "blood_pressure": 190},
    },
]
pd.json_normalize(data, max_level=1)

输出:

在这里,与之前的例子不同,我们对JSON的前两行进行了扁平化处理,这给了扁平化表一个完整的结构。

Python Pandas - 扁平化嵌套的JSON

示例 4:

最后,让我们考虑一个深度嵌套的JSON结构,通过向json_normalize函数传递元参数,它可以被转换为一个平面表,如下图所示。

在这里,在下面的代码中,我们把JSON的时间顺序传递给了一个平面表,JSON必须按照这个顺序进行解析。在下面的代码中,我们首先建议解析部门键,然后是公司和标语,然后,我们将管理层和CEO键作为一个嵌套列表传递,表明他们必须作为一个字段被解析。

import pandas as pd
data = [
    {
        "company": "Google",
        "tagline": "Dont be evil",
        "management": {"CEO": "Sundar Pichai"},
        "department": [
            {"name": "Gmail", "revenue (bn)": 123},
            {"name": "GCP", "revenue (bn)": 400},
            {"name": "Google drive", "revenue (bn)": 600},
        ],
    },
    {
        "company": "Microsoft",
        "tagline": "Be What's Next",
        "management": {"CEO": "Satya Nadella"},
        "department": [
            {"name": "Onedrive", "revenue (bn)": 13},
            {"name": "Azure", "revenue (bn)": 300},
            {"name": "Microsoft 365", "revenue (bn)": 300},
        ],
    },
  
]
result = pd.json_normalize(
    data, "department", ["company", "tagline", ["management", "CEO"]]
)
result

输出:

Python Pandas - 扁平化嵌套的JSON

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程