将嵌套的 JSON 结构转换为 Pandas 数据帧
在本文中,我们将了解如何将嵌套的 JSON 结构转换为 Pandas DataFrames。
具有多个级别的 JSON
在这种情况下,嵌套的 JSON 数据包含另一个 JSON 对象作为其某些属性的值。这使得数据多层次,我们需要根据项目要求将其展平以获得更好的可读性,如下所述。
Python3
# importing the libraries used
import pandas as pd
# initializing the data
data = {
'company': 'XYZ pvt ltd',
'location': 'London',
'info': {
'president': 'Rakesh Kapoor',
'contacts': {
'email': 'contact@xyz.com',
'tel': '9876543210'
}
}
}
Python3
pd.json_normalize(data)
Python3
pd.json_normalize(data,max_level=0)
Python3
pd.json_normalize(data,max_level=1)
Python3
data = [
{
'id': '001',
'company': 'XYZ pvt ltd',
'location': 'London',
'info': {
'president': 'Rakesh Kapoor',
'contacts': {
'email': 'contact@xyz.com',
'tel': '9876543210'
}
}
},
{
'id': '002',
'company': 'PQR Associates',
'location': 'Abu Dhabi',
'info': {
'president': 'Neelam Subramaniyam',
'contacts': {
'email': 'contact@pqr.com',
'tel': '8876443210'
}
}
}
]
pd.json_normalize(data)
Python3
# initialising the data
data = {
'company': 'XYZ pvt ltd',
'location': 'London',
'info': {
'president': 'Rakesh Kapoor',
'contacts': {
'email': 'contact@xyz.com',
'tel': '9876543210'
}
},
'employees': [
{'name': 'A'},
{'name': 'B'},
{'name': 'C'}
]
}
# converting the data to dataframe
df = pd.json_normalize(data)
Python3
pd.json_normalize(data,record_path=['employees'])
Python3
pd.json_normalize(data, record_path=['employees'], meta=[
'company', 'location', ['info', 'president']])
Python3
data = [
{
'id': '001',
'company': 'XYZ pvt ltd',
'location': 'London',
'info': {
'president': 'Rakesh Kapoor',
'contacts': {
'email': 'contact@xyz.com',
'tel': '9876543210'
}
},
'employees': [
{'name': 'A'},
{'name': 'B'},
{'name': 'C'}
]
},
{
'id': '002',
'company': 'PQR Associates',
'location': 'Abu Dhabi',
'info': {
'president': 'Neelam Subramaniyam',
'contacts': {
'email': 'contact@pqr.com',
'tel': '8876443210'
}
},
'employees': [
{'name': 'L'},
{'name': 'M'},
{'name': 'N'}
]
}
]
df = pd.json_normalize(data, record_path=['employees'], meta=[
'company', 'location', ['info', 'president']])
print(df)
在这里,数据包含多个级别。要将其转换为数据框,我们将使用 pandas 库的 json_normalize()函数。
Python3
pd.json_normalize(data)
输出:
在这里,我们看到数据被展平并转换为列。如果我们不希望完全展平数据,我们可以使用max_level属性,如下所示。
Python3
pd.json_normalize(data,max_level=0)
输出:
在这里,我们看到 info 列没有进一步展平。
Python3
pd.json_normalize(data,max_level=1)
输出:
在这里,我们看到联系人列没有进一步展平。
嵌套 JSON 列表
现在,如果数据是嵌套 JSON 的列表,我们将在数据框中获得多条记录。
Python3
data = [
{
'id': '001',
'company': 'XYZ pvt ltd',
'location': 'London',
'info': {
'president': 'Rakesh Kapoor',
'contacts': {
'email': 'contact@xyz.com',
'tel': '9876543210'
}
}
},
{
'id': '002',
'company': 'PQR Associates',
'location': 'Abu Dhabi',
'info': {
'president': 'Neelam Subramaniyam',
'contacts': {
'email': 'contact@pqr.com',
'tel': '8876443210'
}
}
}
]
pd.json_normalize(data)
输出:
所以,在 JSON 有多个级别的情况下,我们可以尝试不同的max_level属性值。
带有嵌套列表的 JSON
在这种情况下,嵌套 JSON 有一个 JSON 对象列表作为其某些属性的值。在这种情况下,我们可以使用record_path属性选择内部列表项作为数据框的记录/行。
Python3
# initialising the data
data = {
'company': 'XYZ pvt ltd',
'location': 'London',
'info': {
'president': 'Rakesh Kapoor',
'contacts': {
'email': 'contact@xyz.com',
'tel': '9876543210'
}
},
'employees': [
{'name': 'A'},
{'name': 'B'},
{'name': 'C'}
]
}
# converting the data to dataframe
df = pd.json_normalize(data)
输出:
在这里,嵌套列表没有展平。我们需要使用record_path属性来展平嵌套列表。
Python3
pd.json_normalize(data,record_path=['employees'])
输出:
现在,我们观察到它不包含“信息”和其他功能。为了包含它们,我们使用另一个属性meta。请注意,在下面的代码中,为了包含内部 JSON 的属性,我们将路径指定为“['info', 'president']”。
Python3
pd.json_normalize(data, record_path=['employees'], meta=[
'company', 'location', ['info', 'president']])
输出:
现在在多个嵌套 JSON 对象的情况下,我们将获得一个包含多个记录的数据框,如下所示。
Python3
data = [
{
'id': '001',
'company': 'XYZ pvt ltd',
'location': 'London',
'info': {
'president': 'Rakesh Kapoor',
'contacts': {
'email': 'contact@xyz.com',
'tel': '9876543210'
}
},
'employees': [
{'name': 'A'},
{'name': 'B'},
{'name': 'C'}
]
},
{
'id': '002',
'company': 'PQR Associates',
'location': 'Abu Dhabi',
'info': {
'president': 'Neelam Subramaniyam',
'contacts': {
'email': 'contact@pqr.com',
'tel': '8876443210'
}
},
'employees': [
{'name': 'L'},
{'name': 'M'},
{'name': 'N'}
]
}
]
df = pd.json_normalize(data, record_path=['employees'], meta=[
'company', 'location', ['info', 'president']])
print(df)
输出 :