如何用Pandas将非常规CSV转换为指定格式的JSON?
非常规CSV转指定结构JSON的Pandas实现方案
完整代码实现
import pandas as pd import json def convert_csv_to_json(csv_path, output_json_path): # 读取全部CSV数据,不限制列 df = pd.read_csv(csv_path) # 初始化目标JSON结构 final_data = {"Students": {}} # 遍历每一条学生记录 for _, student_row in df.iterrows(): stu_id = student_row["ID"] stu_name = student_row["Name"] # 收集当前学生的所有考试成绩 exam_marks = [] # 循环处理32组考试字段(假设字段命名为Exam1_Name、Exam1_Mark...Exam32_Name、Exam32_Mark) for num in range(1, 33): name_col = f"Exam{num}_Name" mark_col = f"Exam{num}_Mark" # 确保字段存在且值不为空,避免报错或无效数据 if name_col in df.columns and mark_col in df.columns: exam_name = student_row[name_col] exam_mark = student_row[mark_col] if pd.notna(exam_name) and pd.notna(exam_mark): exam_marks.append({ "Exam Name": exam_name, "Exam Mark": exam_mark }) # 将学生数据存入最终结构,ID作为键 final_data["Students"][stu_id] = { "Name": stu_name, "Marks": exam_marks } # 写入JSON文件,格式化输出 with open(output_json_path, "w", encoding="utf-8") as f: json.dump(final_data, f, indent=4, ensure_ascii=False) # 调用示例,替换为你的实际文件路径 convert_csv_to_json("your_input.csv", "your_output.json")
关键逻辑说明
- 读取完整数据:去掉原代码的
usecols参数,确保能获取所有32组考试字段。 - 按ID构建键值对:原代码把学生存入数组,不符合需求中"以ID为键"的要求,这里改用字典存储学生数据。
- 循环处理考试字段:通过循环拼接字段名(
ExamX_Name/ExamX_Mark),批量提取32组考试数据,避免重复写32次相同逻辑。 - 空值过滤:加入
pd.notna()判断,跳过空的考试记录,保证生成的JSON数据干净有效。
字段名适配
如果你的CSV中考试字段命名不是ExamX_Name/ExamX_Mark(比如是Exam name 1/Exam mark 1),只需要修改循环里的字段名拼接部分:
# 示例:适配"Exam name 1"格式的字段 name_col = f"Exam name {num}" mark_col = f"Exam mark {num}"
内容的提问来源于stack exchange,提问作者kp27
相关产品推荐
相关产品推荐

