pandas 0.23中json_normalize处理None值的行为变化及兼容方案咨询
解决pandas 0.23+中json_normalize处理嵌套None值的兼容问题
我之前也踩过这个pandas版本升级的坑,0.22和0.23的json_normalize对嵌套None值的处理逻辑确实有明显变化,给你几个能还原旧版本行为的实用方案:
方案一:手动扁平化JSON(通用可靠)
自己写一个递归函数把嵌套JSON展开成扁平的键值对,不管pandas版本如何,都能稳定生成包含所有字段(包括值为None的)的DataFrame:
import pandas as pd def flatten_json(obj, parent_key='', sep='.'): items = [] for k, v in obj.items(): new_key = f"{parent_key}{sep}{k}" if parent_key else k if isinstance(v, dict): items.extend(flatten_json(v, new_key, sep=sep).items()) else: items.append((new_key, v)) return dict(items) # 你的原始JSON数据 my_json = {'event': {'name': 'Bob', 'id': '12345','id2': None}, 'id': '12345', 'labels': []} # 扁平化后转成DataFrame flattened_data = flatten_json(my_json) df = pd.DataFrame([flattened_data])
运行后得到的结果和pandas 0.22的json_normalize完全一致,event.id2列会被保留,值为None。
方案二:强制指定需要保留的字段(适合已知字段结构的场景)
如果你提前明确所有需要的嵌套字段,可以手动构造数据字典,用get()方法安全取值,不存在或值为None的字段会自动填充为None:
import pandas as pd my_json = {'event': {'name': 'Bob', 'id': '12345','id2': None}, 'id': '12345', 'labels': []} # 构造扁平数据结构 flat_data = { 'id': my_json.get('id'), 'labels': my_json.get('labels'), 'event.name': my_json['event'].get('name'), 'event.id': my_json['event'].get('id'), 'event.id2': my_json['event'].get('id2') } df = pd.DataFrame([flat_data])
这个方法直观易懂,但如果字段很多或者结构复杂,写起来会比较繁琐。
方案三:尝试使用errors='ignore'参数(部分场景有效)
pandas 0.23+的json_normalize新增了errors参数,设置为'ignore'可以忽略键不存在的错误,但这个参数对值为None的字段的处理可能不稳定,你可以试试:
from pandas.io.json import json_normalize my_json = {'event': {'name': 'Bob', 'id': '12345','id2': None}, 'id': '12345', 'labels': []} df = json_normalize(my_json, errors='ignore')
如果这个方法对你的场景无效,优先用方案一,它的兼容性和稳定性最好。
内容的提问来源于stack exchange,提问作者Pdubbs
相关产品推荐
相关产品推荐

