如何高效从字段不一致的API响应创建Pandas DataFrame?
问题
API返回的条目存在字段数量不一致的情况:该API共定义106个字段,但受数据可用性限制,每个返回的item仅包含其中的子集(例如data['items'][0]含28个字段,data['items'][1]含100个字段)。
尝试直接用Pandas导入时:
df = pd.DataFrame(data['items']) df.columns = data['headers']
触发长度不匹配错误:
ValueError: Length mismatch: Expected axis has 55 elements, new values have 106 elements
当前临时解决方案在处理25万+大规模数据集时效率极低:
df = pd.DataFrame(columns=data['headers']) for item in data['items']: item_series = pd.Series(item, index=data['headers']) df = pd.concat([df, item_series.to_frame().T], ignore_index=True)
匿名化数据示例:
d = { "headers": [ "Header 1", "Header 2", "Header 3", "Header 4", "Header 5", "Header 6", "Header 7", "Header 8", "Header 9", "Header 10", "Header 11", "Header 12", "Header 13", "Header 14", "Header 15", "Header 16", "Header 17", "Header 18", "Header 19", "Header 20", "Header 21", "Header 22", "Header 23", "Header 24", "Header 25", "Header 26", "Header 27", "Header 28", "Header 29", "Header 30", "Header 31", "Header 32", "Header 33", "Header 34", "Header 35", "Header 36", "Header 37", "Header 38", "Header 39", "Header 40", "Header 41", "Header 42", "Header 43", "Header 44", "Header 45", "Header 46", "Header 47", "Header 48", "Header 49", "Header 50", "Header 51", "Header 52", "Header 53", "Header 54", "Header 55", "Header 56", "Header 57", "Header 58", "Header 59", "Header 60", "Header 61", "Header 62", "Header 63", "Header 64", "Header 65", "Header 66", "Header 67", "Header 68", "Header 69", "Header 70", "Header 71", "Header 72", "Header 73", "Header 74", "Header 75", "Header 76", "Header 77", "Header 78", "Header 79", "Header 80", "Header 81", "Header 82", "Header 83", "Header 84", "Header 85", "Header 86", "Header 87", "Header 88", "Header 89", "Header 90", "Header 91", "Header 92", "Header 93", "Header 94", "Header 95", "Header 96", "Header 97", "Header 98", "Header 99", "Header 100", "Header 101", "Header 102", "Header 103", "Header 104", "Header 105", "Header 106" ], "items": [ { "Header 17": "anon1", "Header 27": "anon2", "Header 28": "anon3", "Header 29": "anon4", "Header 32": "anon5", "Header 33": "anon6", "Header 34": "anon7", "Header 35": "anon8", "Header 36": "anon9", "Header 37": "anon10", "Header 38": "anon11", "Header 39": "anon12", "Header 40": "anon13", "Header 46": "anon14", "Header 50": "anon15", "Header 52": "anon16", "Header 53": "anon17", "Header 55": "anon18", "Header 56": "anon19", "Header 57": "anon20", "Header 58": "anon21", "Header 59": "anon22", "Header 61": "anon23", "Header 62": "anon24", "Header 63": "anon25", "Header 67": "anon26", "Header 68": "anon27", "Header 71": "anon28", "Header 73": "anon29", "Header 75": "anon30", "Header 76": "anon31", "Header 80": "anon32", "Header 81": "anon33", "Header 82": "anon34", "Header 83": "anon35", "Header 84": "anon36", "Header 85": "anon37", "Header 87": "anon38", "Header 88": "anon39", "Header 89": "anon40", "Header 91": "anon41", "Header 92": "anon42", "Header 94": "anon43", "Header 96": "anon44", "Header 97": "anon45", "Header 99": "anon46", "Header 105": "anon47" } ], }
高效解决方案
方法1:构造DataFrame后重排列(最优选择)
Pandas创建DataFrame时会自动为缺失字段填充NaN,只需按指定表头重新排列列即可,完全规避循环操作:
# 直接从items生成DataFrame,缺失字段自动补NaN df = pd.DataFrame(data['items']) # 按API定义的headers重新排列列,确保所有106个字段都存在 df = df.reindex(columns=data['headers'])
此方法利用Pandas向量化操作,处理25万条数据仅需几秒,效率远高于循环方案。
方法2:使用pd.json_normalize
如果API返回嵌套结构(扁平结构同样适用),json_normalize能更灵活处理字段缺失,之后再对齐表头:
df = pd.json_normalize(data['items']) df = df.reindex(columns=data['headers'])
对于复杂嵌套的响应,该方法优势更明显,性能与方法1持平。
方法3:批量转换Series后拼接
若需精细控制,可先将所有item转换为指定全局索引的Series,再一次性拼接,避免多次concat的开销:
# 批量生成Series列表,每个Series以完整headers为索引 series_list = [pd.Series(item, index=data['headers']) for item in data['items']] # 一次性拼接所有Series为DataFrame df = pd.concat(series_list, axis=1).T.reset_index(drop=True)
该方法效率虽略低于前两种,但仍比原循环方案提升数十倍。
内容的提问来源于stack exchange,提问作者dimButTries
相关产品推荐
相关产品推荐

