Pandas读取长度为1的嵌套OrderedDict生成DataFrame结构异常如何解决
嵌套OrderedDict转pandas DataFrame解决方案
问题原因
pandas处理单个一维映射结构(比如单条OrderedDict)时,会默认将值中的可迭代对象拆分为多行。你提供的数据中field2是长度为2的OrderedDict,pandas会将其识别为行维度的数据源,最终生成2行结果,还会把内层OrderedDict的key当成外层索引,因此出现索引异常、记录重复的问题,指定columns参数仅会调整列选择,不会修正行拆分的逻辑,所以没有效果。
解决方法
方法1(推荐,兼容单/多条记录)
将所有待加载的OrderedDict放入列表中,再传入DataFrame构造函数即可。pandas会自动将列表中的每一个OrderedDict识别为单独的一行数据,嵌套结构会作为完整值存入对应列,完全符合预期输出。
示例代码:
from collections import OrderedDict import pandas as pd # 原始数据 dataODict = OrderedDict( [ ('id', '*****'), ('field1', '*****'), ('field2', OrderedDict( [ ('id', '*****'), ('field1', '*****') ] )), ('field3', '*****'), ('field4', '*****'), ('field5', '*****') ] ) # 单条记录加载 df = pd.DataFrame([dataODict]) # 多条记录加载示例 # df = pd.DataFrame([dataODict1, dataODict2, dataODict3])
运行后输出的df结构完全匹配要求的格式,field2列会直接存储整个嵌套OrderedDict对象。
方法2(仅适用于单条记录)
也可以先将OrderedDict转为Series,再转置为DataFrame,效果一致:
df = pd.DataFrame(pd.Series(dataODict)).T
内容的提问来源于stack exchange,提问作者Maile Cupo
相关产品推荐
相关产品推荐

