Python-展平嵌套的JSON文件

时间:2020-08-10 09:43:40

标签: python json pandas

我正在处理从诺贝尔奖API中获得的API数据。
特别是以下端点(Nobel API版本2):https://api.nobelprize.org/2.0/laureates
我已使用自己构建的simple Python Script成功拉出它们。

下面是一些JSON文件内容的示例。
但首先,请允许我提前对代码段的长度表示歉意。
我找不到更好的方式来展示它。

类型-1

{
    "laureates": [
        {
            "birth": {
                "date": "1943-00-00",
                "place": {
                    "city": {
                        "en": "Montclair, NJ",
                        "no": "Montclair, NJ",
                        "se": "Montclair, NJ"
                    },
                    "cityNow": {
                        "en": "Montclair, NJ",
                        "no": "Montclair, NJ",
                        "se": "Montclair, NJ"
                    },
                    "continent": {
                        "en": "North America"
                    },
                    "country": {
                        "en": "USA",
                        "no": "USA",
                        "se": "USA"
                    },
                    "countryNow": {
                        "en": "USA",
                        "no": "USA",
                        "se": "USA"
                    },
                    "locationString": {
                        "en": "Montclair, NJ, USA",
                        "no": "Montclair, NJ, USA",
                        "se": "Montclair, NJ, USA"
                    }
                }
            },
            "familyName": {
                "en": "Spence",
                "se": "Spence"
            },
            "fullName": {
                "en": "A. Michael Spence",
                "se": "A. Michael Spence"
            },
            "gender": "male",
            "givenName": {
                "en": "A. Michael",
                "se": "A. Michael"
            },
            "id": "745",
            "knownName": {
                "en": "A. Michael Spence",
                "se": "A. Michael Spence"
            },
            "links": {
                "action": "Get",
                "href": "http://masterdataapi.nobelprize.org/2/laureate/745",
                "rel": "laureate",
                "types": "application/json"
            },
            "nobelPrizes": [
                {
                    "affiliations": [
                        {
                            "city": {
                                "en": "Stanford, CA",
                                "no": "Stanford, CA",
                                "se": "Stanford, CA"
                            },
                            "cityNow": {
                                "en": "Stanford, CA",
                                "no": "Stanford, CA",
                                "se": "Stanford, CA"
                            },
                            "country": {
                                "en": "USA",
                                "no": "USA",
                                "se": "USA"
                            },
                            "countryNow": {
                                "en": "USA",
                                "no": "USA",
                                "se": "USA"
                            },
                            "locationString": {
                                "en": "Stanford, CA, USA",
                                "no": "Stanford, CA, USA",
                                "se": "Stanford, CA, USA"
                            },
                            "name": {
                                "en": "Stanford University",
                                "no": "Stanford University",
                                "se": "Stanford University"
                            },
                            "nameNow": {
                                "en": "Stanford University"
                            }
                        }
                    ],
                    "awardYear": "2001",
                    "category": {
                        "en": "Economic Sciences",
                        "no": "\u00d8konomi",
                        "se": "Ekonomi"
                    },
                    "categoryFullName": {
                        "en": "The Sveriges Riksbank Prize in Economic Sciences in Memory of Alfred Nobel",
                        "no": "Sveriges Riksbanks pris i \u00f8konomisk vitenskap til minne om Alfred Nobel",
                        "se": "Sveriges Riksbanks pris i ekonomisk vetenskap till Alfred Nobels minne"
                    },
                    "dateAwarded": "2001-10-10",
                    "links": {
                        "action": "Get",
                        "href": "https://masterdataapi.nobelprize.org/2/nobelPrize/eco/2001",
                        "rel": "nobelPrize",
                        "types": "application/json"
                    },
                    "motivation": {
                        "en": "for their analyses of markets with asymmetric information",
                        "se": "f\u00f6r deras analys av marknader med assymetrisk informations"
                    },
                    "portion": "1/3",
                    "prizeAmount": 10000000,
                    "prizeAmountAdjusted": 12295082,
                    "prizeStatus": "received",
                    "sortOrder": "2"
                }
            ]
        }}

内容的2类视图具有一个称为“死亡”的新“键”。
它位于“出生”键和“ familyName”键之间。下面是一个示例。

"death": {
                "date": "2009-09-08",
                "place": {
                    "city": {
                        "en": "Copenhagen",
                        "no": "K\u00f8benhavn",
                        "se": "K\u00f6penhamn"
                    },
                    "cityNow": {
                        "en": "Copenhagen",
                        "no": "K\u00f8benhavn",
                        "se": "K\u00f6penhamn"
                    },
                    "continent": {
                        "en": "Europe"
                    },
                    "country": {
                        "en": "Denmark",
                        "no": "Danmark",
                        "se": "Danmark"
                    },
                    "countryNow": {
                        "en": "Denmark",
                        "no": "Danmark",
                        "se": "Danmark"
                    },
                    "locationString": {
                        "en": "Copenhagen, Denmark",
                        "no": "K\u00f8benhavn, Danmark",
                        "se": "K\u00f6penhamn, Danmark"
                    }
                }
            }

关于JSON,我是一个菜鸟。
但是,据我了解,上述JSON文件是高度嵌套的,因此在将其存储在Pandas DataFrame中之前,需要某种形式的 flattening

这是我受困的地方,我已经在Stack Overflow上搜索了类似的主题。
但是,我无法解决这个问题。看来我可以在Pandas中使用json_normalize函数。但是,考虑到JSON文件的结构,我不确定要在以下参数record_pathmeta上加上什么。

因此,Stack Overflow社区是否可以帮助我学习使用JSON文件?
非常感谢您的宝贵时间!

(如果我不够清楚,
我想将当前的JSON文件展平为展平的版本,以便可以将其用作Pandas DataFrame。
我为此表示歉意!)

1 个答案:

答案 0 :(得分:2)

假设您的第一个片段存储在名为data的变量中,您要做的就是:

import pandas

laureates: pandas.core.frame.DataFrame = pandas.json_normalize(data['laureates'])

,它将为您提供一个DataFrame。问题是每个获奖者都有一个诺贝尔奖得主名单,因此您可能需要将其提取到一个单独的DataFrame中(否则,您将得到一个nobelPrizes列中有字典列表的DF)