如何高效提取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逐行调用解析函数性能更高
效果参考
原始输入样例
a b c d e a1 b1 c1 {"x":1,"y":2} e1 a2 b2 c2 {"x":3,"z":4} e2 处理后输出
a b c e d_key d_value a1 b1 c1 e1 x 1 a1 b1 c1 e1 y 2 a2 b2 c2 e2 x 3 a2 b2 c2 e2 z 4
内容的提问来源于stack exchange,提问作者Deepak Singh
相关产品推荐
相关产品推荐

