如何将含dataclass对象的pd.Series展开为字段为列的pd.DataFrame?
将包含dataclass对象的Pandas Series转换为结构化DataFrame
给定如下代码,生成的Series foo_bar 输出可读性差,直接调用 pd.DataFrame(foo_bar) 无法得到按 foo、bar 字段拆分的结构化结果:
import dataclasses import pandas as pd @dataclasses.dataclass(frozen=True) class FooBar: foo: int bar: str foo_bar = pd.Series([FooBar(1, 'a'), FooBar(2, 'b')], index=[100, 200])
原Series输出:
100 FooBar(foo=1, bar='a') 200 FooBar(foo=2, bar='b') dtype: object
想要得到如下结构化DataFrame:
foo bar 0 1 a 1 2 b
可以用以下几种方法实现:
方法1:借助dataclasses.asdict转换为字典列表
将每个dataclass对象转为字典,再传入pd.DataFrame构造:
df = pd.DataFrame([dataclasses.asdict(item) for item in foo_bar])
方法2:使用pd.json_normalize自动展开属性
json_normalize可以直接识别对象的属性并展开为列,如需重置索引可追加reset_index(drop=True):
df = pd.json_normalize(foo_bar).reset_index(drop=True)
方法3:通过apply手动提取字段
针对字段较少的场景,可手动指定提取每个属性:
df = foo_bar.apply(lambda x: pd.Series({'foo': x.foo, 'bar': x.bar})).reset_index(drop=True)
以上三种方法都能得到目标格式的DataFrame,其中pd.json_normalize是最简洁的方案。
内容的提问来源于stack exchange,提问作者Liran Katzir
相关产品推荐
相关产品推荐

