解析含Null的多层JSON时Pandas报错的Lambda解决方案问询
问题解决:解析含Null的嵌套JSON时
'NoneType' object has no attribute 'keys'报错 问题根源
报错来自pd.json_normalize解析sql_type['data']列表时,列表中存在null值。json_normalize会尝试读取每个元素的键,但null(Python中为None)没有keys属性,因此触发该错误。
解决方案
核心思路是先处理data列表中的None值,再交给pd.json_normalize解析。提供两种实现方式:
方式1:过滤掉None值(丢弃空数据)
修改原拼接代码,在列表推导式中过滤掉data里的None:
import json import pandas as pd with open(r'D:\meta.json', encoding='utf-16') as data_file: data = json.loads(data_file.read()) df = pd.json_normalize(data) # 过滤data中的None值后再解析 result = pd.concat([ pd.json_normalize([item for item in df['columns'][k]['sql_type']['data'] if item is not None]) for k in df['columns'].keys() ])
方式2:用默认值替换None(保留数据位置)
如果需要保留原数据的行数,将None替换为包含默认日期的字典,同时使用Lambda函数完成转换:
import json import pandas as pd with open(r'D:\meta.json', encoding='utf-16') as data_file: data = json.loads(data_file.read()) df = pd.json_normalize(data) # 定义默认日期字典 default_date = {"year": 1970, "month": 1, "day": 1, "start": 2299161.0} # 使用Lambda替换None后解析 result = pd.concat([ pd.json_normalize(map(lambda x: x if x is not None else default_date, df['columns'][k]['sql_type']['data'])) for k in df['columns'].keys() ])
优化日期转换
原transformMDY函数可以简化为直接在解析后的DataFrame中生成完整日期:
# 生成标准化日期,空值填充为1970-01-01 result['Full_Date'] = pd.to_datetime(result[['year', 'month', 'day']], errors='coerce').fillna(pd.Timestamp('1970-01-01')) # 可选:移除不需要的列 result.drop(['year', 'month', 'day', 'start'], axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者jamiel22
相关产品推荐
相关产品推荐

