Python 2.7下pandas json_normalize无法展平MongoDB数据stages字段
解决Python 2.7中pandas json_normalize展平MongoDB数据"stages"字段的问题
嘿,我之前在Python2.7环境里处理MongoDB嵌套数据时也碰到过一模一样的问题!其实核心原因是json_normalize默认不会自动识别并展平嵌套的数组型字段,得咱们手动指定要处理的路径才行。下面是我当时用的可行方案:
第一步:预处理MongoDB文档
MongoDB返回的文档里有ObjectId和ISODate这类特殊类型,直接传给json_normalize可能会出问题,先把它们转成可序列化的格式:
from bson.objectid import ObjectId # 假设docs是你从MongoDB查询到的文档列表 processed_docs = [] for doc in docs: # 将ObjectId转为字符串 doc["_id"] = str(doc["_id"]) # 将ISODate转为字符串或datetime对象(按需选择) doc["versionDate"] = doc["versionDate"].isoformat() processed_docs.append(doc)
第二步:用record_path和meta参数展平数据
关键就在这里——通过record_path指定要展平的嵌套数组字段(也就是你的"stages"),再用meta参数列出需要保留的顶级字段,这样就能把stages的内容和其余数据一并展平:
from pandas.io.json import json_normalize # 展平stages,同时保留其他顶级字段 df = json_normalize( processed_docs, record_path="stages", # 指定要展平的嵌套数组路径 meta=["_id", "niyoCustomerCompanyId", "version", "versionDate"], # 保留的父级字段 errors="ignore" # 可选:如果部分文档没有stages字段,加上这个避免报错 )
举个例子,如果你的原数据里某条文档的stages是[{"stageId": 1, "status": "completed"}, {"stageId": 2, "status": "in_progress"}],处理后的数据框会生成两行,每行都包含_id、niyoCustomerCompanyId等顶级字段,同时带上stages里的stageId和status字段,完全实现了你要的“一并展平”效果。
补充说明
你说逐行处理能正常工作,其实是因为逐行时你手动完成了数组的拆分,而json_normalize需要明确的路径指引才能自动做这件事。另外要注意,Python2.7对应的最后一个pandas版本是0.24.2,这个版本是支持record_path和meta参数的,所以放心用就好。
内容的提问来源于stack exchange,提问作者Sudhakar Chavan
相关产品推荐
相关产品推荐

