pandas DataFrame嵌套JSON列展平:保留其他字段复制生成对应新行
嵌套作者字段展平解决方案
首先你给出的示例Authors字段存在语法错误,修正后的标准格式应为:[{'First_Name':'George','Last_Name':'Washington','Affiliation':'USA'},{'First_Name':'Bill','Last_Name':'Buttlicker','Affiliation':'CAN'}]
以下是两种常用运行环境的实现方法:
1. Pandas 环境操作
操作逻辑为:先校验Authors字段格式,再拆分单作者行,最后解析作者字段合并到原数据集。
import pandas as pd from ast import literal_eval # 构造示例原始数据 raw_data = [ { "Text_ID": 1, "Title": "Theory of Theories", "Abstract": "Text Example", "Year": 2019, "Authors": "[{'First_Name':'George','Last_Name':'Washington','Affiliation':'USA'},{'First_Name':'Bill','Last_Name':'Buttlicker','Affiliation':'CAN'}]" } ] df = pd.DataFrame(raw_data) # 若Authors为字符串格式,需先转为Python列表(已为列表格式可跳过此步) df["Authors"] = df["Authors"].apply(literal_eval) # 核心展平操作 # 1. 将每个作者拆分为单独行 df_exploded = df.explode("Authors", ignore_index=True) # 2. 解析作者字典并合并到原数据集 df_final = pd.concat([ df_exploded.drop("Authors", axis=1), pd.json_normalize(df_exploded["Authors"]) ], axis=1)
输出结果会保留所有原有公共字段,每个作者单独成一行,同时新增First_Name、Last_Name、Affiliation三个作者属性字段。
2. PySpark 环境操作
针对大数据量场景,可直接用Spark内置函数处理:
from pyspark.sql import functions as F # 假设df为原始Spark DataFrame,且Authors字段已解析为array<struct>类型 df_final = df.select( "Text_ID", "Title", "Abstract", "Year", F.explode("Authors").alias("author") ).select( "Text_ID", "Title", "Abstract", "Year", "author.First_Name", "author.Last_Name", "author.Affiliation" )
常见操作失败原因
Authors字段为字符串类型的JSON,未提前转成列表/结构体类型,直接调用json_normalize无法识别- 原始数据中
Authors存在多余嵌套层级、语法错误,需先清洗为一维字典列表格式
内容的提问来源于stack exchange,提问作者Neil Collins
相关产品推荐
相关产品推荐

