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

使用Pandas优化嵌套异构JSON数据拆分多列的方案咨询

高效拆分DataFrame中嵌套JSON字段的方案

场景与需求

我有带嵌套结构且每条JSON键值各不相同的数据,存储在DataFrame的json_field列中:

json_field
1 {"1": {"id": 1, "value": "value1"}, "2": {"id": 2, "value": "value2"}}
2 {"1": {"id": 1, "value": "value1"}, "3": {"id": 3, "value": "value3"}}
3 {"3": {"id": 3, "value": "value3"}, "4": {"id": 4, "value": "value4"}}

需要将每个键对应的值拆分至单独字段,期望输出如下:

field1     field2     field3     field4
1  value1     value2       -           -
2  value1        -       value3        -
3     -          -       value3     value4

已定义表头与ID的映射字典:

headers_mapping = {"field1": 1, "field2": 2, "field3": 3, "field4": 4}

当前实现方式

目前通过循环结合apply逐行处理实现需求,但效率较低:

for header, field_id in headers_mapping.items():
    df[header] = df.apply(
        lambda x: (
            x["json_field"][str(field_id)].get("value", "")
            if x["json_field"].get(str(field_id)) is not None
            else "-"
        ),
        axis=1
    )
df.drop("json_field", axis=1, inplace=True)

更高效的解决方案

原方案的问题在于apply(axis=1)是逐行处理,且循环逐列赋值,在数据量大时性能很差。推荐利用pandas的批量展开+向量化操作实现:

步骤1:确保JSON字段是字典类型

如果json_field存储的是字符串格式的JSON,先解析为字典:

import json
import pandas as pd

df['json_field'] = df['json_field'].apply(json.loads)

步骤2:批量展开JSON并提取value

直接将每个JSON字典展开为Series,提取其中的value值:

# 展开每个json字段,提取value并转为Series
expanded_df = df['json_field'].apply(
    lambda x: pd.Series({k: v['value'] for k, v in x.items()})
)

步骤3:映射列名并补全缺失字段

反转映射字典,将数字键替换为目标表头,同时保留所有需要的字段(缺失的字段自动补NaN):

# 反转映射,把ID转为对应表头
id_to_header = {str(v): k for k, v in headers_mapping.items()}
# 重命名列,只保留目标字段
expanded_df = expanded_df.rename(columns=id_to_header)[headers_mapping.keys()]

步骤4:填充缺失值并得到结果

将NaN替换为-,得到最终结果:

result_df = expanded_df.fillna("-")

方案优势

这种方式避免了逐行逐列的循环操作,利用pandas的内部批量处理逻辑,在数据量较大时,效率会比原方案提升数倍甚至数十倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:05:54