You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:04