使用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
相关产品推荐
相关产品推荐

