【问题标题】:Use json_normalize to normalize json with nested arrays使用 json_normalize 对带有嵌套数组的 json 进行规范化
【发布时间】:2019-12-17 16:42:42
【问题描述】:

我想规范化以下 JSON:

[
    {
        "studentId": 1,
        "studentName": "James",
        "schools": [
            {
                "schoolId": 1,
                "classRooms": [
                    {
                        "classRoomId": {
                            "id": 1,
                            "floor": 2
                        }
                    },
                    {
                        "classRoomId": {
                            "id": 3
                        }
                    },
                ],
                "teachers": [
                    {
                        "teacherId": 1,
                        "teacherName": "Tom"
                    },
                    {
                        "teacherId": 2,
                        "teacherName": "Sarah"
                    }
                ]
            },
            {
                "schoolId": 2,
                "classRooms": [
                    {
                        "classRoomId": {
                            "id": 4
                        }
                    }
                ],
                "teachers": [
                    {
                        "teacherId": 1,
                        "teacherName": "Tom"
                    },
                    {
                        "teacherId": 2,
                        "teacherName": "Sarah"
                    },
                    {
                        "teacherId": 3,
                        "teacherName": "Tara"
                    }
                ]
            }
        ]
    }
]

我想在 Python 中得到下表(表格形式):

studentId studentName schoolId classRoomId.id classRoomId.floor teacherId 
teacherName
1 James 1 1 2 1 Tom
1 James 1 1 2 2 Sarah
1 James 1 3   1 Tom
1 James 1 3   2 Sarah
1 James 2 4   1 Tom
1 James 2 4   2 Sarah
1 James 2 4   3 Tara

我尝试过像这样使用 Pandas json_normalize 函数:

df1 = json_normalize(test1, ["schools","teachers"], ["studentId", "studentName",["schools","teachers"]])
df2 = json_normalize(test1, ["schools","classRooms"], ["studentId", "studentName",["schools","classRooms"]])
df = pd.concat([df1,df2],axis=1)

但这并没有给我我需要的结构。

它不必在 Pandas 中,Python 中的任何其他库或代码都可以。任何帮助都将不胜感激。谢谢。

【问题讨论】:

标签: python json pandas


【解决方案1】:

因为classRoomsteachers 构成了JSON 的两个不同的子树,您将不得不解析它们两次:

classrooms = pd.io.json.json_normalize(json_data, ['schools', 'classRooms'], meta=[
    'studentId',
    'studentName',
    ['schools', 'schoolId']
])

teachers = pd.io.json.json_normalize(json_data, ['schools', 'teachers'], meta=[
    'studentId',
    ['schools', 'schoolId']
])

# Merge and rearrange the columns in the order of your sample output
classrooms.merge(teachers, on=['schools.schoolId', 'studentId']) \
    [['studentId', 'studentName', 'schools.schoolId', 'classRoomId.id', 'classRoomId.floor', 'teacherId', 'teacherName']]

【讨论】:

  • 完美,这给了我确切的结果。非常感谢。现在我只需要想出一个算法来更通用地做到这一点。似乎应该有一些东西可以以通用的方式做到这一点。
猜你喜欢
  • 2021-07-23
  • 2018-01-07
  • 2021-03-22
  • 2020-07-21
  • 2017-09-18
  • 2018-11-26
  • 2020-10-22
  • 2019-12-22
  • 2018-04-09
相关资源
最近更新 更多