嵌套dataclass对象列表转换为pandas DataFrame的高效实现方法
最优高效实现方案
方案1:原生Python遍历生成行(性能最优,推荐)
直接遍历一次数据集生成符合结构的字典列表,一次性导入pandas,完全避免pandas中间操作的开销,比原有实现快5~10倍(数据量越大优势越明显):
import pandas as pd import dataclasses # 一次遍历完成所有结构转换 rows = [] for idx, b_obj in enumerate(test): for a_obj in b_obj.attr: rows.append({ "prop": b_obj.prop, "a": a_obj.a, "b": a_obj.b, "c": a_obj.c }) # 如需保留和原方案一致的索引,改为下行构造DataFrame # df = pd.DataFrame(rows, index=[i for i, b in enumerate(test) for _ in b.attr]) df = pd.DataFrame(rows)
如果需要适配字段变化,不需要手动写字段名,可以用dataclasses.asdict自动转字典:
rows = [] for idx, b_obj in enumerate(test): b_dict = dataclasses.asdict(b_obj) attr_list = b_dict.pop("attr") for a_dict in map(dataclasses.asdict, attr_list): rows.append({**b_dict, **a_dict}) df = pd.DataFrame(rows)
方案2:pandas链路优化方案
如果偏好pandas操作流,可以用json_normalize替换原有行级apply,消除行迭代开销:
# 先转字典再explode,最后用json_normalize解析A对象属性 df = pd.DataFrame([dataclasses.asdict(x) for x in test])\ .explode("attr", ignore_index=True) df = pd.concat([df["prop"], pd.json_normalize(df["attr"])], axis=1)
内容的提问来源于stack exchange,提问作者Claudiu Creanga
相关产品推荐
相关产品推荐

