Pandas json_normalize兼容嵌套对象空值与非空值的实现方法
问题根源
pd.json_normalize在指定record_path参数时,默认会丢弃record_path对应字段为空列表的记录的所有元字段,不会保留对应行,这就是空列表场景下返回空DataFrame的直接原因。
兼容两种场景的实现方案
两种方案都不需要复杂的遍历判断,可直接兼容addressIdentifications为空、单条记录、多条记录的所有情况。
方案1:预处理空列表填充占位值
直接在归一化前给空的addressIdentifications列表填充空字典占位,保证每条记录至少有一条展开项,不修改原有归一化逻辑:
# 预处理原始数据 processed = [] for row in data: current = row.copy() # 空列表填充空字典占位 if not current["addressIdentifications"]: current["addressIdentifications"] = [{}] processed.append(current) # 原有归一化逻辑无需修改 df_out = pd.json_normalize( processed, meta=["address", "risk", ["cluster", "name"], ["cluster", "category"]], record_path="addressIdentifications", record_prefix="addressIdentification_" )
处理后,原空列表记录的address、risk、cluster字段会完整保留,展开的地址标识相关字段为NaN,和非空记录的DataFrame结构完全对齐。
方案2:分块归一化后关联
如果不想修改原始数据,可分两次做归一化,再通过索引关联合并,天然兼容空值场景:
# 第一步:提取基础字段,自动展平cluster嵌套结构,丢弃待展开的列表字段 df_base = pd.json_normalize(data).drop(columns=["addressIdentifications"]) # 第二步:单独展开addressIdentifications列表,自动携带原始行索引 df_ident = pd.json_normalize( data, record_path="addressIdentifications", record_prefix="addressIdentification_" ) # 左连接合并,所有原始记录都会保留,空列表的展开字段自动填充NaN df_out = df_base.join(df_ident)
该方案不需要手动判断字段是否为空,执行效率更高,展平后的cluster字段默认列名为cluster.name、cluster.category,如果需要调整列名可通过df_out.rename()方法修改。
内容的提问来源于stack exchange,提问作者tbw875
相关产品推荐
相关产品推荐

