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

JSON扁平化时合并相似列:自定义CSV输出的代码优化问询

解决方案:移除扁平化JSON中的位置索引,合并同类字段生成目标CSV

针对你遇到的扁平化后列名带位置键(如0_extension_0_url)的问题,这里提供两种直接可行的实现方案,一种从原始JSON直接处理(更高效),另一种处理已扁平化的结果。

方案一:直接处理原始JSON,生成无索引的扁平化数据

这种方式跳过带索引的扁平化步骤,直接递归遍历JSON结构,将数组中同名字段的值收集合并,避免生成冗余的位置键。

代码实现

import json
import pandas as pd
from collections import defaultdict

def flatten_without_indices(data, parent_key='', sep='_'):
    result = defaultdict(list)
    
    def recurse(item, current_key):
        if isinstance(item, dict):
            # 遍历字典字段,拼接父键
            for k, v in item.items():
                new_key = f"{current_key}{sep}{k}" if current_key else k
                recurse(v, new_key)
        elif isinstance(item, list):
            # 遍历数组元素,不添加索引,直接收集同名字段值
            for elem in item:
                recurse(elem, current_key)
        else:
            # 将值添加到对应字段的列表中
            result[current_key].append(item)
    
    recurse(data, parent_key)
    
    # 将列表转为逗号分隔的字符串(可根据需求改为保留列表)
    return {
        k: ','.join(map(str, v)) if len(v) > 1 
        else v[0] if v 
        else None 
        for k, v in result.items()
    }

# 示例使用
if __name__ == "__main__":
    # 原始JSON片段
    raw_json = '''
    {
      "id": "123",
      "extension": [
        {"url": "http://example.com/1", "name": "ext1"},
        {"url": "http://example.com/2", "name": "ext2"}
      ],
      "title": "Sample Data"
    }
    '''
    
    # 解析JSON
    data = json.loads(raw_json)
    # 生成无索引的扁平化数据
    flattened_data = flatten_without_indices(data)
    # 转为DataFrame并导出CSV
    pd.DataFrame([flattened_data]).to_csv('target.csv', index=False)

方案二:处理已带索引的扁平化结果

如果你已经有了带位置键的扁平化字典,可以通过清理键名、合并同类字段值来修复。

代码实现

import pandas as pd
from collections import defaultdict

def clean_flattened_indices(flattened_data):
    result = defaultdict(list)
    for key, value in flattened_data.items():
        # 拆分键名,移除所有纯数字的片段
        cleaned_key = '_'.join([part for part in key.split('_') if not part.isdigit()])
        # 将对应值添加到清理后的键名下
        result[cleaned_key].append(value)
    
    # 合并列表为字符串(按需调整)
    return {
        k: ','.join(map(str, v)) if len(v) > 1 
        else v[0] if v 
        else None 
        for k, v in result.items()
    }

# 示例使用
if __name__ == "__main__":
    # 已扁平化的带索引数据
    indexed_flattened = {
        'id': '123',
        '0_extension_0_url': 'http://example.com/1',
        '0_extension_0_name': 'ext1',
        '0_extension_1_url': 'http://example.com/2',
        '0_extension_1_name': 'ext2',
        'title': 'Sample Data'
    }
    
    # 清理索引并合并字段
    cleaned_data = clean_flattened_indices(indexed_flattened)
    # 导出CSV
    pd.DataFrame([cleaned_data]).to_csv('target_cleaned.csv', index=False)

关键说明

  • 两种方案最终都会生成无位置索引的列名,同类字段的值会合并为逗号分隔的字符串(如果有多个值),单个值则直接保留。
  • 如果需要保留列表格式而非字符串,只需修改最后一步的字典生成逻辑,去掉','.join(map(str, v)),直接返回列表即可。
  • 针对复杂嵌套的JSON结构,递归逻辑会自动处理多层嵌套的数组和字典。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:50:30