Python如何将CSV两列数据合并为带层级缩进的单列
Python实现CSV大洲-国家层级格式化
核心逻辑
逐行读取原始CSV时维护一个缓存变量存当前所属大洲:
- 若当前行
Continent列非空,更新缓存值,将大洲名作为无缩进顶级条目 - 若当前行
Continent列为空,说明该行Countries列内容归属当前缓存大洲,给国家名加4空格缩进后作为子条目 - 所有条目整理完成后可直接打印预览,或写入新的单列CSV文件
可运行代码
方案1:原生csv模块实现(无第三方依赖)
import csv input_path = "你的原始CSV文件路径.csv" output_path = "格式化后输出文件.csv" indent = " " # 4空格匹配示例缩进效果 result = ["Continent"] current_cont = "" with open(input_path, "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: cont_val = row["Continent"].strip() country_val = row["Countries"].strip() if cont_val: current_cont = cont_val # 按需配置缩写转全称映射 if current_cont == "North Am.": current_cont = "North America" result.append(current_cont) if country_val: result.append(f"{indent}{country_val}") # 控制台打印预览 print("Continent") print("-----------") for line in result[1:]: print(line) # 写入新CSV with open(output_path, "w", encoding="utf-8", newline="") as f: writer = csv.writer(f) writer.writerow(["Continent"]) for line in result[1:]: writer.writerow([line])
方案2:pandas实现(适合大数据量场景)
import pandas as pd df = pd.read_csv("你的原始CSV文件路径.csv") # 向前填充空的大洲单元格,将空值替换为上一行的大洲名 df["Continent"] = df["Continent"].str.strip().replace("", pd.NA).ffill() # 大洲名标准化映射 name_map = {"North Am.": "North America"} df["Continent"] = df["Continent"].replace(name_map) output = [] # 按大洲分组拼接层级内容 for cont, group in df.groupby("Continent", sort=False): output.append(cont) for country in group["Countries"].str.strip(): output.append(f" {country}") # 控制台预览 print("Continent\n-----------") print("\n".join(output)) # 保存结果 pd.DataFrame({"Continent": output}).to_csv("格式化后输出文件.csv", index=False)
输出效果
运行后得到的结果和需求完全一致:
Continent ----------- Asia China Japan Korea North America Canada U.S.
如果有其他大洲缩写需要转全称,直接在代码的映射规则里加对应键值对即可,缩进长度也可以通过修改indent变量的空格数调整。
内容的提问来源于stack exchange,提问作者Rebekah Lee
相关产品推荐
相关产品推荐

