
本文详解如何将 CSV 文件中以分号分隔、且某些字段含逗号分隔多值(如 "1, 5"、"Monday, Tuesday")的表格数据,通过 Pandas 正确解析、拆分、展开并导出为符合业务逻辑的嵌套 JSON —— 每个主记录对应一个对象,其 patterns 字段为由多个子对象组成的数组。
本文详解如何将 csv 文件中以分号分隔、且某些字段含逗号分隔多值(如 `"1, 5"`、`"monday, tuesday"`)的表格数据,通过 pandas 正确解析、拆分、展开并导出为符合业务逻辑的嵌套 json —— 每个主记录对应一个对象,其 `patterns` 字段为由多个子对象组成的数组。
在处理配置类或调度规则类 CSV 数据时,常见一种“宽表扁平化”设计:同一行内用逗号分隔多个逻辑上并列的值(例如多个频次计数、多个工作日、多个调度类型)。若直接用 to_dict('records') 转 JSON,这些逗号分隔字符串会被整体保留,无法生成真正的嵌套数组结构——这正是问题核心:CSV 加载本身无错,但后续未对多值字段做语义化解析与行展开。
要达成目标输出(即每个 patterns 是一个对象列表,每个对象对应一组对齐的拆分值),需四步关键操作:
✅ 1. 正确加载 CSV,避免空值误解析
使用 keep_default_na=False 防止 'null' 字符串被转为 NaN,同时显式指定 dtype=object 保留下列原始字符串格式:
import pandas as pd
df = pd.read_csv("data.csv", delimiter=';', keep_default_na=False, dtype=object)
✅ 2. 将多值字符串列转为 Python 列表
对 frequency_count、schedule_type、day_of_week、Comments 等列,用正则 str.split(", ?") 安全分割(兼容 "1, 5" 和 "Thursday,Friday"):
multi_cols = ["frequency_count", "schedule_type", "day_of_week", "Comments"]
for col in multi_cols:
df[col] = df[col].str.split(r",\s*")
⚠️ 注意:此处正则 r",\s*" 可匹配逗号后任意空格,比简单 "," 更鲁棒。
✅ 3. 使用 explode() 展开多值列(关键步骤)
Pandas 的 explode() 可将列表元素逐行展开,自动对齐所有指定列(要求各列列表长度一致,否则抛异常):
df = df.explode(multi_cols, ignore_index=False) # 保持原始索引便于后续分组
展开后,原第1行(Pattern 2)将变为2行,每行携带一对对齐的 frequency_count/schedule_type/day_of_week 值。
✅ 4. 构建嵌套结构并聚合导出 JSON
- 先构造 patterns 子对象列:
df["patterns"] = df[["frequency_count", "schedule_type", "day_of_week"]].to_dict("records") - 统一处理 Comments:将 NaN 或字符串 'null' 统一转为 "null"(按需求可改为 None):
df["Comments"] = df["Comments"].fillna("null").replace("null", "null") - 按主键列分组聚合 patterns 成列表,并导出 JSON:
result = ( df.groupby(["name", "frequency", "frequency_start_date", "Comments"], dropna=False) .apply(lambda x: x["patterns"].tolist()) .reset_index(name="patterns") .to_json(orient="records", indent=4) ) print(result)
✅ 最终输出中,patterns 是标准 JSON 数组,每个元素为独立对象;Comments 字段统一为字符串 "null"(若需 null 类型,改用 None 并确保 to_json(default_handler=str) 兼容)。
总结:该方案本质是「先归一化(split → list)、再爆炸(explode → 行对齐)、后聚合(groupby + list)」,完全规避了手动循环或 zip 的易错性,且充分利用 Pandas 向量化能力,适用于万级数据规模。务必验证各多值列拆分后长度是否一致——这是 explode 成功的前提。











