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

