如何用Python或Excel VBA宏合并DataFrame中三列同名数据?
数据转换方案
一、Excel内置快速方法(最简便,无需代码)
这是最快的处理方式,利用Power Query完成逆透视:
- 选中包含表头的原始数据区域
- 点击「数据」选项卡 → 「从表格/区域」,确认弹窗后进入Power Query编辑器
- 选中「日期」「编号」之外的所有列(即重复的名称列)
- 点击「转换」选项卡 → 「逆透视列」→ 「逆透视其他列」
- 右键将自动生成的「属性」列重命名为「名称」,「值」列重命名为「数值」
- 点击「关闭并上载」,转换后的数据会自动生成新工作表
二、Python Pandas处理方案
利用melt函数快速实现数据逆透视:
import pandas as pd # 读取原始Excel文件,替换为你的文件路径 df = pd.read_excel("原始数据.xlsx", sheet_name="Sheet1") # 执行转换:保留日期、编号列,将其他列转为名称+数值的行 transformed_df = pd.melt( df, id_vars=["日期", "编号"], var_name="名称", value_name="数值" ) # 过滤空值行(可选,根据原始数据情况调整) transformed_df = transformed_df.dropna(subset=["数值"]) # 保存转换后的数据 transformed_df.to_excel("转换后数据.xlsx", index=False)
三、Excel VBA宏处理方案
适合习惯用Excel宏的场景:
Sub 转换数据格式() Dim srcSheet As Worksheet, destSheet As Worksheet Dim lastRow As Long, lastCol As Long, i As Long, j As Long, destRow As Long ' 指定原始数据工作表和新建目标工作表 Set srcSheet = ThisWorkbook.Sheets("Sheet1") ' 替换为你的原始表名 Set destSheet = ThisWorkbook.Sheets.Add destSheet.Name = "转换后数据" ' 写入目标表头 destSheet.Cells(1, 1) = "日期" destSheet.Cells(1, 2) = "编号" destSheet.Cells(1, 3) = "名称" destSheet.Cells(1, 4) = "数值" destRow = 2 ' 获取原始数据的行、列边界 lastRow = srcSheet.Cells(srcSheet.Rows.Count, "A").End(xlUp).Row lastCol = srcSheet.Cells(1, srcSheet.Columns.Count).End(xlToLeft).Column ' 遍历每行数据,拆分写入目标表 For i = 2 To lastRow For j = 3 To lastCol If srcSheet.Cells(i, j).Value <> "" Then destSheet.Cells(destRow, 1) = srcSheet.Cells(i, 1).Value destSheet.Cells(destRow, 2) = srcSheet.Cells(i, 2).Value destSheet.Cells(destRow, 3) = srcSheet.Cells(1, j).Value destSheet.Cells(destRow, 4) = srcSheet.Cells(i, j).Value destRow = destRow + 1 End If Next j Next i ' 自动调整列宽 destSheet.Columns.AutoFit MsgBox "转换完成!" End Sub
使用说明:
- 打开Excel按
Alt+F11进入VBA编辑器 - 右键当前工作簿 → 插入 → 模块
- 粘贴上述代码,修改
Sheet1为你的原始数据工作表名 - 按
F5运行宏,完成转换
内容的提问来源于stack exchange,提问作者user22724645
相关产品推荐
相关产品推荐

