python - Python - 展平嵌套的 JSON 文件
问题描述
我正在处理从诺贝尔奖 API 中提取的 API 数据。
特别是以下端点(Nobel API 版本 2):https ://api.nobelprize.org/2.0/laureates 我已经使用我构建的简单 Python 脚本
成功地提取了它们。
以下是 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 视图有一个新的“键”,称为“死亡”。
它位于“birth”键和“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 中之前,
需要进行某种形式的展平。
这就是我卡住的地方,我在 Stack Overflow 上搜索了类似的主题。
但是,我无法理解它。看来我可以json_normalize
在 Pandas 中使用该功能。但是,鉴于 JSON 文件的结构,我不确定在以下参数record_path
和中放置什么。meta
因此,Stack Overflow 社区会帮助我学习使用 JSON 文件吗?
非常感谢您的宝贵时间!
(如果我不够清楚,
我想将我当前的 JSON 文件展平为展平版本,以便将其用作 Pandas DataFrame。
对此我深表歉意!)
解决方案
假设您的第一个片段存储在一个名为 的变量中data
,您需要做的就是:
import pandas
laureates: pandas.core.frame.DataFrame = pandas.json_normalize(data['laureates'])
它会给你一个DataFrame。问题是每个获奖者都有诺贝尔奖列表,因此您可能希望将其提取到单独的 DataFrame 中(否则您最终会得到一个 DF,其中列中有一个 dicts 列表nobelPrizes
)
推荐阅读
- java - 我正在合并排序长度为 10,000 到 75,000 的 int 数组。我得到了奇怪的排序时间。为什么会这样?
- node.js - 猫鼬电话不返回
- vb.net - 在 Visual Basic 中拆分字符串时出错?
- javascript - JS验证函数跳过字段并从中间开始
- php - 如何修复 php 页面中 shell_exec 中的 pm2 错误?
- button - 从 BUTTON 或 SCRIPTEDITOR 运行时脚本不同
- html - 如果主要内容很短,则带有页脚的可滚动侧边栏可见
- protocol-buffers - .proto 文件中的 json 标记
- amazon-web-services - 如何使用具有现货 EC2 实例的感觉的单个 EBS 卷
- sql - 从 TXT SUM 组中获取数据并减去