我似乎找不到任何内置方法可以简单地将 Pydantic BaseModels 列表转换为 Pandas Dataframe。
from pydantic import BaseModel
import pandas as pd
class SomeModel(BaseModel):
col1: str
col2: str
data = [SomeModel(**{'col1': 'foo', 'col2': 'bar'})] * 10
pd.DataFrame(data)
Output
>> 0 1
>> 0 (col1, foo) (col2, bar)
>> 1 (col1, foo) (col2, bar)
>> ...
通过这种方式,列将作为数据加载。解决方法是执行以下操作
pd.DataFrame([model.dict() for model in data])
Output
>> col1 col2
>> 0 foo bar
>> 1 foo bar
>> ...
然而,对于大量数据,此方法有点慢。有更快的方法吗?
快速而肮脏的分析会产生以下值:
from pydantic import BaseModel
import pandas as pd
from fastapi.encoders import jsonable_encoder
class SomeModel(BaseModel):
col1: int
col2: str
data = [SomeModel(col1=1,col2="foo"),SomeModel(col1=2,col2="bar")]*4*10**5
import cProfile
cProfile.run( 'pd.DataFrame([s.dict() for s in data])' ) # around 8.2s
cProfile.run( 'pd.DataFrame(jsonable_encoder(data))' ) # around 30.8s
cProfile.run( 'pd.DataFrame([s.__dict__ for s in data])' ) # around 1.7s
cProfile.run( 'pd.DataFrame([dict(s) for s in data])' ) # around 3s
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)