📜  将嵌套的 JSON 结构转换为 Pandas 数据帧

📅  最后修改于: 2022-05-13 01:54:32.406000             🧑  作者: Mango

将嵌套的 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)

输出:

json 数据转换为 pandas 数据框

在这里,我们看到数据被展平并转换为列。如果我们不希望完全展平数据,我们可以使用max_level属性,如下所示。

Python3

pd.json_normalize(data,max_level=0)

输出:

json 数据转换为 pandas 数据框

在这里,我们看到 info 列没有进一步展平。

Python3

pd.json_normalize(data,max_level=1)

输出:

json 数据转换为 pandas 数据框

在这里,我们看到联系人列没有进一步展平。

嵌套 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 数据转换为 pandas 数据框

所以,在 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)

输出:

json 数据转换为 pandas 数据框

在这里,嵌套列表没有展平。我们需要使用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 数据转换为 pandas 数据框

现在在多个嵌套 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)

输出 :

json 数据转换为 pandas 数据框