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

