Python如何将3列宽表数据转换为2列长表格式
原代码可用性分析
原代码不能正常运行,存在以下问题:
- 变量名不统一:定义的结果列表名为
final_output,追加元素时误用为final_out,会触发名称错误 - 字符串未加引号:字典键
A、B以及取字段用的col1、col2、col3都是字符串字面量,必须加引号,否则会被识别为未定义变量报错 - 文件操作参数错误:
open(tgt_file.csv, w)中的文件名和打开模式都是字符串类型,需要加引号 - 缺少必要前置逻辑:没有导入
csv模块,也没有读取源表得到rows的相关代码
修正后的标准库实现(无需第三方依赖)
import csv # 读取源宽表 with open("source.csv", "r") as src_file: csv_reader = csv.DictReader(src_file) rows = list(csv_reader) hdr = ['col1', 'col2'] final_output = [] for row in rows: # 分别拼接col2、col3的数据行 final_output.append({"col1": row["col1"], "col2": row["col2"]}) final_output.append({"col1": row["col1"], "col2": row["col3"]}) # 写入目标长表,加newline参数避免Windows系统下出现多余空行 with open("tgt_file.csv", "w", newline="") as tgt_file: csv_writer = csv.DictWriter(tgt_file, fieldnames=hdr, delimiter=',') csv_writer.writeheader() csv_writer.writerows(final_output)
更简洁高效的pandas实现
如果允许使用第三方数据处理库,pandas的melt方法专门用于宽表转长表,代码量极小,且大数据量下性能远高于手动循环:
import pandas as pd # 读取宽表 df = pd.read_csv("source.csv") # 宽转长:保留col1作为主键,把col2、col3的值合并到新列 df_long = df.melt(id_vars="col1", value_vars=["col2", "col3"], value_name="col2") # 丢弃不需要的原列名列 df_long = df_long.drop(columns="variable") # 写入结果,关闭默认索引列输出 df_long.to_csv("tgt_file.csv", index=False)
内容的提问来源于stack exchange,提问作者zappy
相关产品推荐
相关产品推荐

