资讯内容
Python介绍嵌套 JSON 秒变 Dataframe!
K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
推荐(免费):python教程K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
调用API和文档数据库会返回嵌套的JSON对象,当我们使用Python尝试将嵌套结构中的键转换为列时,数据加载到pandas中往往会得到如下结果:K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
df = pd.DataFrame.from_records(results [“ issues”],columns = [“ key”,“ fields”])说明:这里results是一个大的字典,issues是results其中的一个键,issues的值为一个嵌套JSON对象字典的列表,后面会看到JSON嵌套结构。问题在于API返回了嵌套的JSON结构,而我们关心的键在对象中确处于不同级别。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
嵌套的JSON结构张成这样的。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
而我们想要的是下面这样的。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
下面以一个API返回的数据为例,API通常包含有关字段的元数据。假设下面这些是我们想要的字段。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
key:JSON密钥,在第一级的位置。summary:第二级的“字段”对象。status name:第三级位置。statusCategory name:位于第4个嵌套级别。如上,我们选择要提取的字段在issues列表内的JSON结构中分别处于4个不同的嵌套级别,一环扣一环。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
{ "expand": "schema,names", "issues": [ { "fields": { "issuetype": { "avatarId": 10300, "description": "", "id": "10005", "name": "New Feature", "subtask": False }, "status": { "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.", "id": "5", "name": "Resolved", "statusCategory": { "colorName": "green", "id": 3, "key": "done", "name": "Done", } }, "summary": "Recovered data collection Defraglar $MFT problem" }, "id": "11861", "key": "CAE-160", }, { "fields": { ... more issues], "maxResults": 5, "startAt": 0, "total": 160 }一个不太好的解决方案K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
一种选择是直接撸码,写一个查找特定字段的函数,但问题是必须对每个嵌套字段调用此函数,然后再调用.apply到DataFrame中的新列。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
为获取我们想要的几个字段,首先我们提取fields键内的对象至列:K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
df = ( df["fields"] .apply(pd.Series) .merge(df, left_index=True, right_index = True) )从上表看出,只有summary是可用的,issuetype、status等仍然埋在嵌套对象中。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
下面是提取issuetype中的name的一种方法。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
# 提取issue type的name到一个新列叫"issue_type" df_issue_type = ( df["issuetype"] .apply(pd.Series) .rename(columns={"name": "issue_type_name"})["issue_type_name"] ) df = df.assign(issue_type_name = df_issue_type)像上面这样,如果嵌套层级特别多,就需要自己手撸一个递归来实现了,因为每层嵌套都需要调用一个像上面解析并添加到新列的方法。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
对于编程基础薄弱的朋友,手撸一个其实还挺麻烦的,尤其是对于数据分析师,着急想用数据的时候,希望可以快速拿到结构化的数据进行分析。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
下面东哥分享一个pandas的内置解决方案。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
内置的解决方案K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
pandas中有一个牛逼的内置功能叫 .json_normalize。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
pandas的文档中提到:将半结构化JSON数据规范化为平面表。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
前面方案的所有代码,用这个内置功能仅需要3行就可搞定。步骤很简单,懂了下面几个用法即可。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
确定我们要想的字段,使用 . 符号连接嵌套对象。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
将想要处理的嵌套列表(这里是results["issues"])作为参数放进 .json_normalize 中。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
过滤我们定义的FIELDS列表。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
FIELDS = ["key", "fields.summary", "fields.issuetype.name", "fields.status.name", "fields.status.statusCategory.name"] df = pd.json_normalize(results["issues"]) df[FIELDS]没错,就这么简单。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
其它操作K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
记录路径K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
除了像上面那样传递results["issues"]列表之外,我们还使用record_path参数在JSON对象中指定列表的路径。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
# 使用路径而不是直接用results["issues"] pd.json_normalize(results, record_path="issues")[FIELDS]自定义分隔符K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
还可以使用sep参数自定义嵌套结构连接的分隔符,比如下面将默认的“.”替换“-”。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
### 用 "-" 替换默认的 "." FIELDS = ["key", "fields-summary", "fields-issuetype-name", "fields-status-name", "fields-status-statusCategory-name"] pd.json_normalize(results["issues"], sep = "-")[FIELDS]控制递归K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
如果不想递归到每个子对象,可以使用max_level参数控制深度。在这种情况下,由于statusCategory.name字段位于JSON对象的第4级,因此不会包含在结果DataFrame中。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
# 只深入到嵌套第二级 pd.json_normalize(results, record_path="issues", max_level = 2)下面是.json_normalize的pandas*方文档说明,如有不明白可自行学习,本次东哥就介绍到这里。K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
pandas*方文档:https://pandas.pydata.org/pan...以上就是Python介绍嵌套 JSON 秒变 Dataframe!的详细内容,更多请关注少儿编程网其它相关文章!K8Y少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
- 上一篇
传授 每30秒学会一个Python小技巧
简介很多学习Python视频教程的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经有了很好的方法来解决。当然,孰能生巧,当我们代码熟练了,自然就能总结一些好用的技巧,不过对于那些还在刚熟悉Python的同学可能并不会那么轻松。推荐(免费):Python视频教程本次给大家推荐
- 下一篇
介绍python描述符的意义
简介你也许经常会听到「描述符」这个概念,但是由于大多数的程序员很少会使用到他,所以可能你并不太清楚了解它的原理,python视频教程栏目将详细介绍推荐(免费):python视频教程但是如果你想自己的事业来说更上一层的话,对于python的使用更加熟练的话,我认为你还是应该对描述符的这个概念有一个清晰的了