对于复杂的JSON数据进行分析时,通常的做法是将JSON数据结构转换为Pandas DataFrame,因为它可以帮助更方便地操作和可视化数据。在本文中,让我们考虑不同的嵌套JSON数据结构,并使用内置和自定义函数将它们扁平化。
Pandas有一个很好的内置函数json_normalize(),可以将简单到中等半结构化的嵌套JSON结构扁平化为数据表。
语法: pandas.json_normalize(data, errors=’raise’, sep=’.’, max_level=None)
参数:
data - 字典或字典列表
errors - {‘raise’, ‘ignore’},,默认值”raise“
sep - str,默认值“.”嵌套记录将生成由指定分隔符分隔的名称。
max_level - int,默认为None。要规格化的最大级别数(字典深度)。
JSON - > Pandas DataFrame示例
大多数通过从Web提取的数据都是JSON数据类型的形式,因为JSON是在Web应用程序中传输数据的首选数据类型。首选JSON的原因是,由于文件大小很小,它非常轻量级,可以在HTTP请求和响应中来回发送。
下面是我们可以在Python中扁平化嵌套json的示例:
示例1:Pandas json_normalize函数
考虑一个嵌套字典列表,其中包含有关学生及其分数的详细信息。在这个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)
输出
Roll no student.first_name student.last_name student.English student.Math student.Science
0 1 Ram kumar NaN NaN NaN
1 NaN NaN NaN 95 88 NaN
2 2 Joseph NaN 90 NaN 82
3 3 abinaya devi 91 98 NaN
示例2:使用max_level=0在Pandas中展平嵌套的JSON
现在让我们使用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)
输出
由于我们只使用了一个层次的扁平化,第二个层次被保留为键值对
id candidate health_index
0 1.0 Roberto mathews {'bmi': 22, 'blood_pressure': 130}
1 NaN Shane wade {'bmi': 28, 'blood_pressure': 160}
2 2.0 Bruce tommy {'bmi': 31, 'blood_pressure': 190}
示例3:使用max_level=1在Pandas中展平嵌套的JSON
现在让我们使用与上面相同的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)
输出
id candidate health_index.bmi health_index.blood_pressure
0 1.0 Roberto mathews 22 130
1 NaN Shane wade 28 160
2 2.0 Bruce tommy 31 190
示例4:将Meta参数传递给json_normalize
最后,让我们考虑一个深度嵌套的JSON结构,通过将Meta参数传递给json_normalize函数,可以将其转换为数据表,如下所示。
这里,在下面的代码中,我们已经将JSON必须解析到数据表的时间顺序传递给了它。在下面的代码中,我们首先建议解析部门键,然后是公司和标语,然后,我们将management和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
输出
name revenue (bn) company tagline management.CEO
0 Gmail 123 Google Dont be evil Sundar Pichai
1 GCP 400 Google Dont be evil Sundar Pichai
2 Google drive 600 Google Dont be evil Sundar Pichai
3 Onedrive 13 Microsoft Be What's Next Satya Nadella
4 Azure 300 Microsoft Be What's Next Satya Nadella
5 Microsoft 365 300 Microsoft Be What's Next Satya Nadella