如何将含嵌套KVP结构的JSON字符串展平为Pandas DataFrame?
解决嵌套JSON展平为Pandas DataFrame的问题
你的需求是把每个通话记录下的kvpdata数组拆分成独立行,同时保留上层的callId、_type字段,还要展开kvpdict里的键值对。直接用json_normalize容易因为多层嵌套没处理好导致结果不符合预期,下面是可行的解决方案:
步骤说明
- 先处理原始JSON字符串(你的示例用了单引号,Python里可以用
ast.literal_eval解析成合法数据结构) - 遍历每条通话记录,将每个
kvpdata条目与上层的callId、_type合并 - 把每个
kvpdata里的kvpdict字典展开,和当前条目的其他字段合并 - 收集所有处理后的条目,转为Pandas DataFrame
完整代码示例
import pandas as pd import ast # 你的原始JSON数据 raw_data = """ [ { 'callId': 'ff0818c8', 'kvpdata': [ { 'kvptype': 'customer', 'kvpdict': { 'attribute1': 'value1', 'attribute2': 'value2', 'attribute3': 'value3', 'attribute4': 'value4' }, 'agentId': '9f1989ab-d1b6-4498-8cf7-f195918f92b4', 'commIds': [ '3af52ec2-53b0-4c4b-a833-6d09e9058d68' ] }, { 'kvptype': 'queue', 'kvpdict': { 'attribute1': '10', 'attribute3': '[value3]' }, 'agentId': '36285ba0-a87e-4b29-afe8-4aa29189b766', 'commIds': [ '95e8cca0-401a-4b3e-9f1e-60f5934880f3' ] } ], '_type': 'calldata' }, { 'callId': 'sfsdfsd23', 'kvpdata': [ { 'kvptype': 'customer', 'kvpdict': { 'attribute1': 'v1', 'attribute4': 'value4' }, 'agentId': '92323b-d1b6-4498-8cf7-f195918f92b4', 'commIds': [ '3adsds2-53b0-4c4b-a833-6d09e9058d68' ] }, { 'kvptype': 'queue', 'kvpdict': { 'attribute1': '10', 'attribute3': '[value3]', 'attribute8': 'value8' }, 'agentId': '3dd5ba0-a87e-4b29-afe8-4aa29189b766', 'commIds': [ '95e8cca0-dfda-4b3e-9f1e-60f5934880f3' ] }, { 'kvptype': 'agent', 'kvpdict': { 'attribute9': '80', 'attribute6': '23'}, 'agentId': '56d5ba0-a87e-4b29-afe8-4aa29189b766', 'commIds': [ '00e8cca0-dfda-4b3e-9f1e-60f5934880f3' ] } ], '_type': 'calldata' } ] """ # 解析原始数据 data = ast.literal_eval(raw_data) # 生成扁平化的条目列表 flattened_data = [] for call in data: # 提取通话基础字段 call_base = { 'callId': call['callId'], '_type': call['_type'] } # 遍历每个kvp数据点 for kvp in call['kvpdata']: # 合并基础字段、kvp字段 item = {**call_base, **kvp} # 展开kvpdict并移除原键 item.update(item.pop('kvpdict')) flattened_data.append(item) # 转为DataFrame df = pd.DataFrame(flattened_data) print(df)
输出结果
生成的DataFrame会包含callId、_type、kvptype、agentId、commIds,以及所有kvpdict中的属性字段(如attribute1、attribute2等),每个kvpdata对应一行,缺失的属性会自动填充为NaN,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者chinna7326
相关产品推荐
相关产品推荐

