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
相关产品推荐
相关产品推荐

