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

如何重命名嵌套DataFrame的列名以适配BigQuery字段命名规范

问题原因

原来的prepare_json函数仅重命名了DataFrame最顶层的列名,嵌套JSON转换得到的DataFrame中,object类型列存储的字典、列表嵌套结构内部的键名未被处理,这些内部键会作为BigQuery的嵌套字段名,不符合命名规范导致报错。

解决方案

优先选择先处理原始JSON的全层级键名,再转换为DataFrame的方案,实现逻辑更简单可靠,不会触发Pandas嵌套数据类型的兼容问题。

完整实现代码如下:

import re
import pandas as pd
import json

def format_key(key: str) -> str:
    # 替换空格为下划线
    formatted = key.replace(' ', '_')
    # 首字符为数字则追加下划线前缀,兼容空键场景
    if formatted and formatted[0].isdigit():
        formatted = '_' + formatted
    return formatted

def format_json_keys(obj):
    if isinstance(obj, dict):
        # 递归处理字典的所有键和值
        return {format_key(k): format_json_keys(v) for k, v in obj.items()}
    elif isinstance(obj, list):
        # 递归处理列表的每个元素
        return [format_json_keys(item) for item in obj]
    else:
        # 基础类型直接返回
        return obj

# 业务处理流程示例
if __name__ == "__main__":
    # 1. 加载原始JSON
    with open("your_json_file.json", "r", encoding="utf-8") as f:
        raw_json = json.load(f)
    # 2. 全层级格式化所有键名
    processed_json = format_json_keys(raw_json)
    # 3. 转换为DataFrame(按需求选择json_normalize或普通转换方法)
    df = pd.json_normalize(processed_json)

效果说明

该方案会递归遍历JSON的所有层级,对每一个键执行两次格式化操作:

  • 替换键名中的空格为下划线
  • 若键名首字符为数字,自动在开头追加下划线前缀
    完全匹配BigQuery的字段命名规则:仅包含字母、数字、下划线,开头为字母或下划线。

如果确实需要处理已经生成的嵌套DataFrame,可以将DataFrame先通过to_json()方法转为JSON格式,再调用上述format_json_keys处理后重新转回DataFrame即可。

内容的提问来源于stack exchange,提问作者Vahn Toan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:48:03