You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Beanie ODM查询结果生成Pandas DataFrame列名异常求助

问题:Beanie ODM查询结果转Pandas DataFrame时列名变为数字序列

尝试用Beanie ODM查询MongoDB数据并生成Pandas DataFrame,结果DataFrame的列名是0到76的数字序列,而非数据库对应的字段名。

使用的代码:

async def champion_classification_generator():
    data = await MatchParticipantsSchema.find({}).to_list()
    if data:
        df = pd.DataFrame(list(data))
        print(df.head(5))

    return None

数据示例(简化展示):

[MatchParticipantsSchema(id=ObjectId('63cca053d8b828d7da370ca4'), revision_id=None, matchID='6139692722', summonerPuuid='lb_jUxQcHM028sGKWEmnzYMtp3RmTt3op_L3vbtHJQr58l7zyyVDVPonpvulBf6npVhAraJHaYgDkA', teamSide='blue', position='TOP_LANE', win=1, ...), ...]
原因

直接将Beanie的文档实例列表传入pd.DataFrame()时,Pandas无法识别实例的字段名——这些实例不是原生字典类型,会被当成普通可迭代对象处理,最终列名变成默认的索引序列。

解决方案

需要把每个Beanie文档实例转换为字典格式,再传入Pandas生成DataFrame,以下是两种常用实现方式:

方式1:使用model_dump()(适配Beanie基于Pydantic v2的版本)

遍历查询结果,将每个实例通过model_dump()转为字典:

async def champion_classification_generator():
    data = await MatchParticipantsSchema.find({}).to_list()
    if data:
        # 转换每个实例为字典格式
        data_dicts = [item.model_dump() for item in data]
        df = pd.DataFrame(data_dicts)
        print(df.head(5))

    return None

方式2:使用dict()(适配Beanie基于Pydantic v1的版本)

如果你的Beanie版本依赖Pydantic v1,用dict()方法完成转换:

async def champion_classification_generator():
    data = await MatchParticipantsSchema.find({}).to_list()
    if data:
        data_dicts = [dict(item) for item in data]
        df = pd.DataFrame(data_dicts)
        print(df.head(5))

    return None

额外优化:过滤空值字段

如果需要移除值为None的字段,可以在转换时添加过滤逻辑:

data_dicts = [{k: v for k, v in item.model_dump().items() if v is not None} for item in data]

内容的提问来源于stack exchange,提问作者Mario Sacramento

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:05:24