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)
输出:
示例 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级扁平化,第二级被保留为一个键值对,如图所示
示例 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的前两行进行了扁平化处理,这给了扁平化表一个完整的结构。
示例 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
输出: