pandas100个骚操作:JSON自动解析为DataFrame
来源:Python数据科学
作者:东哥起飞
大家好,我是你们的东哥。
本篇是pandas100个骚操作的第2篇:JSON自动解析为DataFrame
全部内容请点文章头部的「pandas100个骚操作」系列查看。
调用API和文档数据库会返回嵌套的JSON对象,当我们使用Python尝试将嵌套结构中的键转换为列时,数据加载到pandas中往往会得到如下结果:
df = pd.DataFrame.from_records(results [“ issues”],columns = [“ key”,“ fields”])
key:JSON密钥,在第一级的位置。
summary:第二级的“字段”对象。
status name:第三级位置。
statusCategory name:位于第4个嵌套级别。
{
"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
}
一个不太好的解决方案
df = (
df["fields"]
.apply(pd.Series)
.merge(df, left_index=True, right_index = True)
)
# 提取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)
内置的解决方案
确定我们要想的字段,使用 . 符号连接嵌套对象。 将想要处理的嵌套列表(这里是results["issues"])作为参数放进 .json_normalize 中。 过滤我们定义的FIELDS列表。
FIELDS = ["key", "fields.summary", "fields.issuetype.name", "fields.status.name", "fields.status.statusCategory.name"]
df = pd.json_normalize(results["issues"])
df[FIELDS]
没错,就这么简单。
其它操作
记录路径
# 使用路径而不是直接用results["issues"]
pd.json_normalize(results, record_path="issues")[FIELDS]
自定义分隔符
# 用 "-" 替换默认的 "."
FIELDS = ["key", "fields-summary", "fields-issuetype-name", "fields-status-name", "fields-status-statusCategory-name"]
pd.json_normalize(results["issues"], sep = "-")[FIELDS]
控制递归
# 只深入到嵌套第二级
pd.json_normalize(results, record_path="issues", max_level = 2)
爱点赞的人,运气都不会太差
评论