转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
相关产品推荐
相关产品推荐

