Python中使用eval()处理字符串字典缺失值的方法咨询
处理字符串字典缺失值并解析为DataFrame列
核心问题
直接用eval()解析字符串字典时,遇到缺失值(如NaN、空字符串、格式不合法的伪字典)会抛出异常,需要换用更稳健的解析方式,同时兼容缺失场景。
方法一:自定义安全解析函数
通过json.loads替代eval()(更安全,仅解析合法JSON),配合异常处理覆盖缺失值和格式错误的情况:
import json import pandas as pd def safe_parse_dict(s): # 处理缺失值(NaN、空字符串) if pd.isna(s) or str(s).strip() == "": return {} # 尝试解析JSON字符串,失败则返回空字典 try: return json.loads(s) except (json.JSONDecodeError, TypeError): return {} # 转换content列为字典类型 df['content'] = df['content'].apply(safe_parse_dict) # 将字典展开为列 expanded_content = df['content'].apply(pd.Series) # 合并回原DataFrame final_df = pd.concat([df.drop('content', axis=1), expanded_content], axis=1)
方法二:用pd.json_normalize简化流程
Pandas内置的json_normalize可以直接解析字典列表,配合缺失值预处理更高效:
import json import pandas as pd # 先把所有缺失/空内容替换为合法空字典字符串 df['content'] = df['content'].fillna("{}").replace("", "{}") # 解析为字典后直接归一化 expanded_content = pd.json_normalize(df['content'].apply(json.loads)) # 合并结果 final_df = pd.concat([df.drop('content', axis=1), expanded_content], axis=1)
关键说明
- 优先用
json.loads而非eval():eval()会执行任意代码,存在安全风险,且对JSON格式的兼容性不如json.loads。 - 缺失值处理逻辑:将单元格级的缺失(如
NaN、空字符串)转为空字典,展开后对应列会自动填充NaN,不影响后续列对齐。 - 字典内部键缺失:
apply(pd.Series)或json_normalize会自动为不存在的键填充NaN,无需额外处理。
内容的提问来源于stack exchange,提问作者mahamadou niakate
相关产品推荐
相关产品推荐

