将对象转换为pandas数据框架

3

我有一个对象列表,就像下面的测试变量一样:

@dataclasses.dataclass
class A:
    a: float
    b: float
    c: float

@dataclasses.dataclass
class B:
    prop: str
    attr: List["A"]

test = [
    B("z", [A('a', 'b', 'c'), A('d', 'l', 's')]),
    B("a", [A('s', 'v', 'c')]),
]

我希望将其转换为类似于以下pandas数据框的形式:

   prop a   b   c
0   z   a   b   c
0   z   d   l   s
1   a   s   v   c

我可以通过几个步骤来完成,但这似乎是不必要和低效的,因为我需要多次处理相同的数据:

a = pd.DataFrame(
        [obj.__dict__ for obj in test]
    )
a
    prop    attr
0   z   [A(a='a', b='b', c='c'), A(a='d', b='l', c='s')]
1   a   [A(a='s', b='v', c='c')]

b = a.explode('attr')
b
    prop    attr
0   z   A(a='a', b='b', c='c')
0   z   A(a='d', b='l', c='s')
1   a   A(a='s', b='v', c='c')

b[["a", "b", "c"]] = b.apply(lambda x: [x.attr.a, x.attr.b, x.attr.c], axis=1, result_type="expand")
b

prop    attr    a   b   c
0   z   A(a='a', b='b', c='c')  a   b   c
0   z   A(a='d', b='l', c='s')  d   l   s
1   a   A(a='s', b='v', c='c')  s   v   c

能否更加高效地完成这项任务?

2个回答

4
使用 dataclasses.asdictpd.json_normalize 的组合。
In [59]: pd.json_normalize([dataclasses.asdict(k) for k in test], 'attr', ['prop'])
Out[59]:
   a  b  c prop
0  a  b  c    z
1  d  l  s    z
2  s  v  c    a

1

另一种版本:

df = pd.DataFrame({"prop": b.prop, **a.__dict__} for b in test for a in b.attr)

结果:

  prop  a  b  c
0    z  a  b  c
1    z  d  l  s
2    a  s  v  c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接