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

如何高效提取DataFrame列信息并展平JSON列后存入DataFrame

Pandas 含JSON列展平的高效实现方案

核心原则:全程使用Pandas内置向量化接口,避免逐行循环操作,大数据量下性能比手写迭代高1~2个数量级。

实现步骤

针对你给出的a/b/c(字符串列)、d(JSON值列)、e(字符串列)的表结构,按以下流程处理即可:

  • 预处理JSON列:如果d列存储的是未解析的JSON字符串,先批量转为Python字典结构,不要逐行apply
  • 结构化解析JSON:用内置json_normalize批量把JSON结构转为扁平表结构
  • 行展开:对解析后的嵌套结构用explode或stack把多值拆为单独行,和原非JSON列按索引对齐合并

代码示例

前置预处理(仅当d列是JSON字符串时需要)

import pandas as pd
import json

# 批量解析JSON字符串,比逐行apply快5倍以上
df['d'] = [json.loads(item) for item in df['d'].tolist()]

场景1:d列是JSON对象(键值对结构),每个键值对应单独一行

# 解析d列JSON,将键值对打平为行,自动和原表索引对齐
d_parsed = pd.json_normalize(df['d'])\
    .stack()\
    .reset_index(level=1)\
    .rename(columns={'level_1':'d_key', 0:'d_value'})

# 合并原表非JSON列,得到最终结果
result = df.drop(columns=['d']).join(d_parsed).reset_index(drop=True)

场景2:d列是JSON数组,数组内每个元素对应单独一行

# 直接用explode做行展开,全程C层实现无Python层循环
result = df.explode(column='d', ignore_index=True)

# 如果数组内是嵌套JSON对象,追加一步拆为独立列
if isinstance(result['d'].iloc[0], dict):
    d_fields = pd.json_normalize(result['d'])
    result = pd.concat([result.drop(columns=['d']), d_fields], axis=1)

性能避坑

  • 不要用iterrows()、apply(axis=1)逐行处理数据,10万行以上数据性能会下降10~100倍
  • 不要自己手写循环拼接列表生成新DataFrame,json_normalize和explode都做了内存和计算优化,稳定性和速度更优
  • 解析JSON字符串时优先用列表推导批量处理,比map/apply逐行调用解析函数性能更高

效果参考

原始输入样例

abcde
a1b1c1{"x":1,"y":2}e1
a2b2c2{"x":3,"z":4}e2

处理后输出

abced_keyd_value
a1b1c1e1x1
a1b1c1e1y2
a2b2c2e2x3
a2b2c2e2z4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:25:31