使用Python Pandas将CSV转换为指定结构JSON的技术求助
CSV转特定结构JSON的解决方案
需求说明
将CSV文件转换为指定结构的JSON:以CSV第一列(A1)的唯一标识(NA、NE、SE)作为JSON的顶级键,每个键对应一个对象数组,数组中的每个对象包含sDate、eDate和小写的a2(数值类型)字段,排除原CSV中的A1列。
输入CSV示例
A1,sDate,eDate,A2 NA,01/01/2023,01/05/2023,2 NE,01/01/2023,01/05/2023,3 SE,01/01/2023,01/05/2023,4 NA,02/01/2023,02/05/2023,5 NE,02/01/2023,02/05/2023,6 SE,02/01/2023,02/05/2023,7
期望JSON输出
{ "NA": [ { "sDate": "01/01/2023", "eDate": "01/05/2023", "a2": 2 }, { "sDate": "02/01/2023", "eDate": "02/05/2023", "a2": 5 } ], "NE": [ { "sDate": "01/01/2023", "eDate": "01/05/2023", "a2": 3 }, { "sDate": "02/01/2023", "eDate": "02/05/2023", "a2": 6 } ], "SE": [ { "sDate": "01/01/2023", "eDate": "01/05/2023", "a2": 4 }, { "sDate": "02/01/2023", "eDate": "02/05/2023", "a2": 7 } ] }
原代码问题分析
你提供的代码存在以下问题:
- 使用
names参数读取CSV,导致原表头被当作数据行处理 - 未按A1列分组,错误地将所有数据归入
NA键下 - 保留了不需要的A1列,未将A2列名改为小写的
a2,也未转换为数值类型
解决方案
方法一:使用Pandas实现
import pandas as pd import json # 读取CSV,第一行自动作为表头 df = pd.read_csv('file.csv') # 重命名A2列为a2,并转换为整数类型 df = df.rename(columns={'A2': 'a2'}) df['a2'] = df['a2'].astype(int) # 按A1列分组,构建目标JSON结构 result = {} for group_key, group_df in df.groupby('A1'): # 移除A1列,转换为字典列表 result[group_key] = group_df.drop(columns='A1').to_dict(orient='records') # 写入JSON文件 with open('output.json', 'w') as f: json.dump(result, f, indent=4)
方法二:原生Python实现(无需第三方库)
如果不想依赖Pandas,可使用Python标准库完成:
import csv import json result = {} with open('file.csv', 'r') as csv_file: # 按表头读取CSV行 reader = csv.DictReader(csv_file) for row in reader: # 提取分组键,移除原A1字段 group_key = row.pop('A1') # 处理A2字段:转整数并重命名为a2 row['a2'] = int(row.pop('A2')) # 初始化分组列表(如果不存在)并添加数据 if group_key not in result: result[group_key] = [] result[group_key].append(row) # 写入JSON文件 with open('output.json', 'w') as json_file: json.dump(result, json_file, indent=4)
两种方法均可生成符合要求的JSON结构,其中原生方法无需额外安装依赖,Pandas方法适合处理大规模CSV数据。
内容的提问来源于stack exchange,提问作者ncwxpanther
相关产品推荐
相关产品推荐

