如何将Tableau返回的嵌套字典列表转为pandas MultiIndex DataFrame
Tableau嵌套返回结果通用展平方案
针对Tableau接口返回的「值中嵌套列表的字典列表」格式,不需要针对每个查询硬编码字段处理逻辑,以下通用方案可覆盖绝大多数单层平行嵌套场景:
处理规则
自动识别每个顶层字典的字段类型,按规则展平:
- 非列表值字段:映射到
(原字段名, 原字段名)的二级MultiIndex列,行值随嵌套列表展开长度自动复制 - 列表值字段:遍历列表内子字典的键,映射到
(列表字段名, 子字典键名)的二级列;同一顶层字典下的多个平行列表按索引位置对齐,长度不足的位置补None - 无嵌套列表的顶层字典默认展开为1行
通用实现代码
import pandas as pd def flatten_tableau_resp(resp: list) -> pd.DataFrame: processed_rows = [] for entry in resp: # 拆分普通字段、嵌套列表字段 plain_cols = {} nested_list_cols = {} for key, val in entry.items(): if isinstance(val, list): nested_list_cols[key] = val else: plain_cols[key] = val # 计算当前条目需要展开的总行数 expand_row_cnt = max([len(lst) for lst in nested_list_cols.values()], default=1) expand_row_cnt = max(expand_row_cnt, 1) # 逐行组装展平后的数据 for idx in range(expand_row_cnt): current_row = {} # 写入普通字段 for p_key, p_val in plain_cols.items(): current_row[(p_key, p_key)] = p_val # 写入各嵌套列表对应位置的字段 for list_key, list_val in nested_list_cols.items(): sub_entry = list_val[idx] if idx < len(list_val) else {} for sub_key, sub_val in sub_entry.items(): current_row[(list_key, sub_key)] = sub_val processed_rows.append(current_row) # 生成带MultiIndex列的DataFrame,缺失值自动填充为None result_df = pd.DataFrame(processed_rows) result_df.columns = pd.MultiIndex.from_tuples(result_df.columns) return result_df
调用验证
传入示例原始数据:
r = [{'name': 'TestWorkbook', 'embeddedDatasources': [{'name': 'Test1', 'id':'uuid1'}, {'name': 'Test2', 'id': 'uuid2'}], 'upstreamDatasources': [{'name': 'Test1', 'id': 'uuid1'}]}, {'name': 'TestWorkbook2', 'embeddedDatasources': [{'name': 'OtherTest', 'id': 'uuid3'}], 'upstreamDatasources': []}] df = flatten_tableau_resp(r)
输出结果和目标格式完全匹配:
name embeddedDatasources upstreamDatasources name name id name id 0 TestWorkbook Test1 uuid1 Test1 uuid1 1 TestWorkbook Test2 uuid2 None None 2 TestWorkbook2 OtherTest uuid3 None None
补充说明
- 该方案不需要提前预知返回字段结构,新的查询接口只要是1层平行嵌套格式都可以直接复用
pd.json_normalize仅适合单个嵌套列表的展平场景,同层级存在多个平行嵌套列表时,直接调用会生成错误的笛卡尔积行,无法满足按索引对齐的需求- 如果存在2层及以上的深层嵌套,只需要在遍历子字典时增加递归解析逻辑即可扩展支持
内容的提问来源于stack exchange,提问作者Faller
相关产品推荐
相关产品推荐

