如何高效提取DataFrame嵌套JSON信息并添加为新列?
优化Pandas嵌套数据提取与新列添加
原代码问题分析
- 使用
iterrows()逐行迭代效率极低,数据量较大时性能瓶颈明显 - 冗余的
json.loads(json.dumps(x))操作完全多余:通过pd.read_json加载的数据已经是Python字典/列表对象,直接取值即可,无需重复序列化和反序列化
优化后的实现代码
import pandas as pd # 加载数据 df_nested = pd.read_json('train.json') df_sample = df_nested.sample(n=50, random_state=0) # 批量添加新列,使用向量化操作替代逐行迭代 df_sample = df_sample.assign( # 提取table字段中的表格核心数据 extracted_table=lambda x: x['table'].apply(lambda d: d.get('table')), # 提取paragraphs列表中的所有文本内容 paragraph_texts=lambda x: x['paragraphs'].apply(lambda lst: [p.get('text') for p in lst]), # 提取questions列表中的所有问题文本 question_list=lambda x: x['questions'].apply(lambda lst: [q.get('question') for q in lst]), # 提取questions列表中的所有答案内容 answer_list=lambda x: x['questions'].apply(lambda lst: [q.get('answer') for q in lst]), # 提取questions列表中的所有答案类型 answer_type_list=lambda x: x['questions'].apply(lambda lst: [q.get('answer_type') for q in lst]), # 提取questions列表中的所有推导过程 program_list=lambda x: x['questions'].apply(lambda lst: [q.get('derivation') for q in lst]) ) # 查看处理后的结果 display(df_sample)
可选:将单个问题拆分为单独行
如果需要把每个question单独拆分成一行(一行对应一个问题-答案对),可以在添加新列后使用explode:
# 展开问题相关列,每个问题占一行 df_exploded = df_sample.explode( column=['question_list', 'answer_list', 'answer_type_list', 'program_list'], ignore_index=True ) display(df_exploded)
优化说明
- 使用
assign()方法一次性批量添加新列,代码更简洁易维护 - 内层
apply()是对列的向量化处理,性能远高于iterrows()逐行迭代 - 移除冗余的json操作,直接从字典/列表中取值,减少不必要的计算开销
内容的提问来源于stack exchange,提问作者Betafish
相关产品推荐
相关产品推荐

