如何将Pandas DataFrame中的defaultdict字符串转换为字典
Pandas defaultdict字符串列转字典实现方案
核心处理逻辑
- 优先处理异常值:对NaN、全空白字符串统一返回默认值,避免解析报错
- 修正序列化字符串格式:替换
ast.literal_eval无法识别的<class 'xxx'>类标识为对应的类名,兼容带空格的格式写法 - 异常捕获兜底:添加解析错误捕获,避免非法格式导致程序中断
完整实现代码
import pandas as pd import ast import re from collections import defaultdict def parse_defaultdict_str(s, default_factory=list): # 处理空值、空白字符串 if pd.isna(s) or not str(s).strip(): return defaultdict(default_factory) s = str(s).strip() # 正则替换匹配任意带空格的类标识写法,适配< class 'list'>、<class 'list'>等格式 class_pattern = re.compile(rf'<\s*class\s*[\'"]{re.escape(default_factory.__name__)}[\'"]\s*>') s = class_pattern.sub(default_factory.__name__, s) try: parsed = ast.literal_eval(s) # 如需转换为普通字典,可改为 return dict(parsed) return parsed except (SyntaxError, ValueError): # 解析失败可根据业务需求调整返回值,支持返回空字典{}或None return defaultdict(default_factory) # 测试用例 df = pd.DataFrame({ 'id': ['7e9zsX7CM4','ftisjah421'], 'img_dict': ["defaultdict(< class 'list'>, {'7e9zsX7CM4': ['https://image_1.png','https://image_2.png']})", " "] }) # 批量转换整列 df['parsed_dict'] = df['img_dict'].apply(parse_defaultdict_str) # 效果验证 print(type(df['parsed_dict'][0])) # 输出 <class 'collections.defaultdict'> print(df['parsed_dict'][0]['7e9zsX7CM4']) # 输出 ['https://image_1.png', 'https://image_2.png']
自定义调整说明
- 若defaultdict的默认工厂不是list,调用时传入对应工厂即可,比如
parse_defaultdict_str(s, default_factory=int) - 解析失败的兜底返回值可根据业务需求修改,比如直接返回空字典
{}或None
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

