Pandas拆分JSON字符串列报JSONDecodeError的缺失值填充方案
解决方案
直接替换单引号转JSON的写法有两个明显问题:一是如果属性值内部本身包含单引号,会直接破坏JSON结构;二是没有对空值、截断/非法格式的字符串做容错,传入json.loads必然触发解码报错。
你的properties列存储的本身是Python字典格式的字符串,不需要强行转标准JSON再解析,搭配异常捕获做容错处理即可顺利完成拆分,解析失败的字段统一填充为NaN。
修正后可直接运行的代码
import pandas as pd import json import ast import numpy as np def parse_prop(s): # 空值、非字符串类型直接返回NaN if pd.isna(s) or not isinstance(s, str) or s.strip() == "": return np.nan try: # 直接解析Python字典格式字符串,避免替换单引号带来的格式损坏 res = ast.literal_eval(s) return res if isinstance(res, dict) else np.nan except (SyntaxError, ValueError): # 兜底兼容已经是标准JSON格式的行 try: res = json.loads(s.replace("'", '"')) return res if isinstance(res, dict) else np.nan except: # 所有解析逻辑失败返回NaN return np.nan df_copy = df.copy() # 安全解析properties列 df_copy["parsed_prop"] = df_copy["properties"].apply(parse_prop) # 拆分解析成功的字典为独立列 split_df = pd.concat( df_copy["parsed_prop"].dropna().apply(pd.json_normalize).tolist(), ignore_index=True, index=df_copy["parsed_prop"].dropna().index ) # 拼接回原表,丢弃冗余列 final_df = df_copy.drop(columns=["properties", "parsed_prop"]).join(split_df)
逻辑说明
- 弃用全局替换单引号的逻辑,用
ast.literal_eval直接解析字典格式字符串,兼容值内部带单引号、Unicode转义字符(比如样例里的\u2713)的场景,不会人为制造格式错误。 - 多层校验+异常捕获覆盖所有异常场景:空值、非字符串、格式截断、非法字符、非字典类型的解析结果都会被判定为坏值,对应拆分后的列自动填充NaN,不会中断代码运行。
- 如果需要自定义坏值的填充内容,直接把函数中返回
np.nan的位置替换为目标值即可,比如填充空字典可以写return {}。
内容的提问来源于stack exchange,提问作者Mohamed Najb
相关产品推荐
相关产品推荐

