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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:00:46