You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 21:13:10