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

Python Pandas中apply方法优化:JSON解析生成DataFrame场景

优化Pandas apply方法的性能方案

嘿,这个问题我太有发言权了!apply(axis=1)虽然好用,但在处理中等以上规模的数据集时,性能拉胯是出了名的——因为它本质上是在Python层面逐行循环,完全没用到Pandas的向量化优势。咱们直接用两种更高效的方式重构你的代码:

方法一:直接提取嵌套字段(向量化操作)

既然你的agent和performance列都是字典类型,咱们可以用Pandas的.str属性直接访问嵌套键,这是完全向量化的操作,速度比apply快一个量级:

def parse_metrics_to_df(metrics):
    df = pd.DataFrame(metrics)
    # 直接提取嵌套字段,全程向量化
    df['trial'] = df['agent'].str['trial']
    df['numerosity'] = df['agent'].str['numerosity']
    df['reliable'] = df['agent'].str['reliable']
    df['was_correct'] = df['performance'].str['was_correct']
    # 移除不需要的列
    df = df.drop(['agent', 'environment', 'performance'], axis=1)
    return df

方法二:用pd.json_normalize一步到位

如果你的metrics本身就是JSON对象(字典)的列表,那直接用pd.json_normalize来展开嵌套结构,连初始的pd.DataFrame()都省了,效率更高:

def parse_metrics_to_df(metrics):
    # 直接展开嵌套JSON,指定要提取的字段
    df = pd.json_normalize(
        metrics,
        meta=[
            ['agent', 'trial'],
            ['agent', 'numerosity'],
            ['agent', 'reliable'],
            ['performance', 'was_correct']
        ]
    )
    # 重命名列名(可选,让列名更简洁)
    df.columns = ['trial', 'numerosity', 'reliable', 'was_correct']
    # 如果原数据还有其他顶层字段,记得保留,这里可以根据需求调整
    return df

为什么这些方法更快?

  • 向量化操作是在Pandas的C底层实现的,避免了Python循环的开销;
  • json_normalize是专门为嵌套JSON结构设计的工具,内部做了大量优化,比手动处理更高效。

如果你的数据集特别大(百万级以上),还可以考虑用Dask来做并行处理,但一般来说,上面两种方法已经能解决绝大多数场景的性能问题了。

内容的提问来源于stack exchange,提问作者Khozzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:43:03