You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含嵌套KVP结构的JSON字符串展平为Pandas DataFrame?

解决嵌套JSON展平为Pandas DataFrame的问题

你的需求是把每个通话记录下的kvpdata数组拆分成独立行,同时保留上层的callId、_type字段,还要展开kvpdict里的键值对。直接用json_normalize容易因为多层嵌套没处理好导致结果不符合预期,下面是可行的解决方案:

步骤说明

  1. 先处理原始JSON字符串(你的示例用了单引号,Python里可以用ast.literal_eval解析成合法数据结构)
  2. 遍历每条通话记录,将每个kvpdata条目与上层的callId、_type合并
  3. 把每个kvpdata里的kvpdict字典展开,和当前条目的其他字段合并
  4. 收集所有处理后的条目,转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:57:42