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

转JSON为Pandas DataFrame遇ValueError错误,寻求解决帮助

JSON转Pandas DataFrame报错解决:ValueError: Mixing dicts with non-Series may lead to ambiguous ordering

问题说明

将指定JSON转换为Pandas DataFrame时,触发错误:
ValueError: Mixing dicts with non-Series may lead to ambiguous ordering

目标JSON内容

{
    "testCaseResult": {
        "timestamp": 1696257561,
        "testCaseStatus": "Failed",
        "result": "Found nullCount=2. It should be 0",
        "testResultValue": [
            {
                "name": "nullCount",
                "value": "2"
            }
        ],
        "testCaseFailureStatus": {
            "testCaseFailureStatusType": "New",
            "updatedAt": 1696257581779
        }
    }
}

报错代码

import pandas as pd
import json  # 原代码遗漏该导入,补充后完整代码如下

f = open(fjson )
data = json.load(f)
f.close()
for i in data['testCaseResult']:
    print(i)
testCaseResult_df = pd.DataFrame(data['testCaseResult'])

错误原因

data['testCaseResult']中同时存在三种数据类型:

  • 普通值(如timestamp、testCaseStatus)
  • 嵌套字典(testCaseFailureStatus)
  • 列表(testResultValue)

Pandas直接转换这种混合结构时,无法确定不同类型数据的排列规则,因此抛出排序歧义的错误。

解决方法

方法1:全量展平嵌套结构

将所有嵌套的字典、列表展开为扁平键值对,适合需要完整保留所有数据细节的场景:

import pandas as pd
import json

def flatten_dict(d, parent_key='', sep='_'):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            items.extend(flatten_dict(v, new_key, sep=sep).items())
        elif isinstance(v, list):
            for i, item in enumerate(v):
                if isinstance(item, dict):
                    items.extend(flatten_dict(item, f"{new_key}_{i}", sep=sep).items())
                else:
                    items.append((f"{new_key}_{i}", item))
        else:
            items.append((new_key, v))
    return dict(items)

# 读取并处理JSON
with open(fjson) as f:
    data = json.load(f)

# 展平嵌套结构后转为DataFrame
flattened_data = flatten_dict(data['testCaseResult'])
testCaseResult_df = pd.DataFrame([flattened_data])
print(testCaseResult_df)

输出的DataFrame会将嵌套字段用下划线拼接,例如testCaseFailureStatus_testCaseFailureStatusType、testResultValue_0_name等。

方法2:拆分处理不同类型字段

如果不需要完整保留嵌套结构,可以拆分提取普通字段、单独处理嵌套内容,灵活性更高:

import pandas as pd
import json

with open(fjson) as f:
    data = json.load(f)
    
test_case_data = data['testCaseResult']

# 提取非嵌套的普通字段
basic_fields = {k: v for k, v in test_case_data.items() if not isinstance(v, (dict, list))}
df_basic = pd.DataFrame([basic_fields])

# 单独处理列表类型的testResultValue
df_test_result = pd.DataFrame(test_case_data['testResultValue'])

# 单独处理字典类型的testCaseFailureStatus
df_failure_status = pd.DataFrame([test_case_data['testCaseFailureStatus']])

# 按需合并DataFrame(横向合并示例)
final_df = pd.concat([df_basic, df_test_result, df_failure_status], axis=1)
print(final_df)

内容的提问来源于stack exchange,提问作者Mario Pellegrini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:40:55