有没有一种简单的方法可以从一个Iterable类或attrs对象构造一个pandas DataFrame?

jdg4fx2g  于 2023-11-15  发布在  其他
关注(0)|答案(1)|浏览(101)

我们可以用dataclass es这样做:

from dataclasses import dataclass
import pandas as pd

@dataclass
class MyDataClass:
    i: int
    s: str

df = pd.DataFrame([MyDataClass("a", 1), MyDataClass("b", 2)])

字符串
这使得DataFramedf具有is列,正如人们所期望的那样。
有没有一个简单的方法可以用attrs类来做到这一点?
我可以通过迭代对象的属性并构造一个类似dict[str, list](在本例中为{"i": [1, 2], "s": ["a", "b"]})的类型的对象并从中构造DataFrame来实现,但直接支持attrs对象会更好。

bqf10yzr

bqf10yzr1#

你可以像这样访问字典的核心

a = MyDataClass("a", 1)
a.__dict__

字符串
这将产生:

{'i': 'a', 's': 1}


了解了这一点,如果您有一个MyDataClass类型的可迭代arr,则可以访问__dict__属性并构造一个嵌套框架

arr = [MyDataClass("a", 1), MyDataClass("b", 2)]
df = pd.DataFrame([x.__dict__ for x in arr])


df输出:

i  s
0  a  1
1  b  2


这种方法的局限性是,如果使用slots选项,则这将不起作用。
或者,也可以分别使用dataclasses.astupledataclasses.asdict将数据从类转换为元组或字典。
Dataframe 也可以使用以下任意一种方式构建:

# using astuple
df = pd.DataFrame(
  [dataclasses.astuple(x) for x in arr], 
  columns=[f.name for f in dataclasses.fields(MyDataClass)]
)

# using asdict
df = pd.DataFrame([dataclasses.asdict(x) for x in arr])

相关问题