
本文详解如何处理 CSV 中以逗号分隔的多值列(如 frequency_count, day_of_week),通过字符串切分、explode() 展开与字典聚合,生成符合嵌套结构要求的 JSON 输出。
本文详解如何处理 csv 中以逗号分隔的多值列(如 `frequency_count`, `day_of_week`),通过字符串切分、`explode()` 展开与字典聚合,生成符合嵌套结构要求的 json 输出。
在将 CSV 转为嵌套 JSON 时,常见陷阱是:当某列包含多个用逗号分隔的值(如 "1, 5"、"Monday, Tuesday")时,Pandas 默认将其读作单一字符串,而非独立条目。若直接调用 to_dict('records'),会导致所有值被“扁平打包”进一个对象中,无法实现真正的多模式(multi-pattern)嵌套结构。
要达成目标输出——即每个 Pattern N 对应一个 "patterns" 数组,其中每个元素代表一组独立的配置项(如 frequency_count=1 + day_of_week=Monday),关键在于先解析多值字符串为列表,再按行展开(explode),最后按主键聚合为嵌套数组。
✅ 正确处理流程
1. 加载数据并预处理多值列
使用 keep_default_na=False 避免 null 被误转为 NaN,再对指定列应用正则分割(", ?" 可兼容 "a,b" 和 "a, b"):
import pandas as pd
df = pd.read_csv(csv1, delimiter=';', keep_default_na=False, dtype=str)
multi_cols = ["frequency_count", "schedule_type", "day_of_week", "Comments"]
for col in multi_cols:
df[col] = df[col].str.split(r",\s*") # 安全分割,去除空格
⚠️ 注意:dtype=str 比 dtype=object 更可控;若原始 CSV 含空值,str.split() 会返回 [None],后续需统一处理。
2. 展开多值行(核心步骤)
explode() 将每行中列表类型的列“炸开”为多行,保持其他列不变,并自动对齐:
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
df = df.explode(multi_cols, ignore_index=False) # 保留原始索引便于分组
此时 Pattern 2 会变为两行,分别对应 frequency_count="1"/"5",且 day_of_week、schedule_type 等列同步拆解。
3. 构建嵌套 pattern 字典
基于已展开的行,构造单个 pattern 对象(注意类型转换可选):
# 可选:将 frequency_count 转为 int(若需数值类型)
df["frequency_count"] = pd.to_numeric(df["frequency_count"], errors="ignore")
df["patterns"] = df[["frequency_count", "schedule_type", "day_of_week"]].to_dict("records")
4. 按主键聚合,生成 patterns 数组
使用 pivot_table 或 groupby 将同一 pattern 名下的所有子项聚合成 list:
# 推荐方式:groupby + apply(list)
result = (
df.groupby(["name", "frequency", "frequency_start_date", "Comments"])
.apply(lambda x: x["patterns"].tolist())
.reset_index(name="patterns")
)
# 补充 Comments 空值标准化(如原文本为 "null")
result["Comments"] = result["Comments"].replace("null", None)
# 输出 JSON(注意:comments → Comments 字段名需与原始一致)
json_output = result.to_json(orient="records", indent=4, default_handler=str)
print(json_output)
? 关键要点总结
- 不要跳过 explode():它是将“伪多值字符串”转化为真正多记录的桥梁;
- 避免 to_dict('records') 直接作用于未展开的 DataFrame:否则只会生成单个错误嵌套对象;
- 字段对齐至关重要:explode() 会保证 frequency_count[i] 与 day_of_week[i] 严格对应;
- JSON 中 null 应由 Python None 表示:pandas.to_json() 自动处理,无需手动写 "null" 字符串;
- 若需更复杂嵌套(如添加 id 或校验逻辑),可在 groupby 后添加自定义函数处理。
通过以上四步,即可稳健地将含多值 CSV 映射为结构清晰、语义准确的嵌套 JSON,完美适配 API 请求、配置文件或前端渲染等场景。










