如何在Excel中将多单元格数据按ID重组为单行?
解决方案:按ID聚合多行数据为平铺列
Power Query 方案(完全适用,推荐)
Power Query完全能覆盖你的场景——10000个唯一ID、每个ID最多100行数据的规模,且支持动态适配任意数量的原始Value列。具体操作步骤如下:
导入数据到Power Query
选中目标数据区域,点击「数据」选项卡 →「自表格/区域」(确保勾选「我的表格具有标题」)。按ID分组打包行数据
在Power Query编辑器中选中ID列,点击「转换」选项卡 →「分组依据」:- 分组依据:
ID - 新列名:
GroupedRows - 操作选择:
所有行
确认后,每个ID对应的所有原始行将被打包为一个列表。
- 分组依据:
生成扁平值列表
添加自定义列(「添加列」→「自定义列」),输入公式:List.Combine(List.Transform([GroupedRows], each Record.ToList(_) skip 1))该公式会将每组内的每一行去掉ID字段,再把所有Value值合并成连续的扁平列表。
展开列表并重命名列
- 删除
GroupedRows列; - 点击自定义列右侧的展开箭头,选择「将值扩展到新列」;
- 选中所有新列,右键→「重命名」,用
1、2、3...序列批量命名(也可通过「转换」→「格式」→「自定义」,输入Text.From([ColumnIndex])自动生成序号)。
- 删除
加载回Excel
点击「关闭并上载」,即可得到目标格式的数据。
其他可选方案
VBA 宏方案
适合熟悉Excel宏的用户,本地处理速度快,无需额外工具:
Sub FlattenIDRows() Dim ws As Worksheet, lastRow As Long, lastCol As Long Dim dataDict As Object, idKey As Variant, rowVals As Variant Dim maxTotalCols As Integer, outputRow As Integer, colIdx As Integer Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column Set dataDict = CreateObject("Scripting.Dictionary") ' 读取数据到字典:键为ID,值为所有Value的扁平数组 For i = 2 To lastRow idKey = ws.Cells(i, 1).Value rowVals = ws.Range(ws.Cells(i, 2), ws.Cells(i, lastCol)).Value rowVals = Application.Transpose(Application.Transpose(rowVals)) ' 转成一维数组 If dataDict.Exists(idKey) Then dataDict(idKey) = dataDict(idKey) & rowVals Else dataDict(idKey) = rowVals End If Next i ' 计算最大列数并设置表头 maxTotalCols = 0 For Each idKey In dataDict If UBound(dataDict(idKey)) > maxTotalCols Then maxTotalCols = UBound(dataDict(idKey)) End If Next idKey ws.Cells.ClearContents ws.Cells(1, 1).Value = "ID" For colIdx = 1 To maxTotalCols ws.Cells(1, colIdx + 1).Value = colIdx Next colIdx ' 写入结果数据 outputRow = 2 For Each idKey In dataDict ws.Cells(outputRow, 1).Value = idKey For colIdx = 1 To UBound(dataDict(idKey)) ws.Cells(outputRow, colIdx + 1).Value = dataDict(idKey)(colIdx) Next colIdx outputRow = outputRow + 1 Next idKey End Sub
使用方法:按Alt+F11打开VBA编辑器,插入模块后粘贴代码,回到Excel执行宏即可。
Python Pandas 方案
适合大数据量场景或有Python基础的用户,代码简洁高效:
import pandas as pd # 读取原始数据(替换为你的文件路径) df = pd.read_excel("your_input_file.xlsx") # 按ID分组,将每组的Value列扁平化并展开成新列 flattened_df = df.groupby("ID").apply( lambda group: pd.Series(group.drop("ID", axis=1).values.flatten()) ).unstack() # 重命名列为1、2、3... flattened_df.columns = [str(i+1) for i in range(flattened_df.shape[1])] # 重置索引,将ID放回第一列 result_df = flattened_df.reset_index() # 保存结果(替换为你的输出路径) result_df.to_excel("your_output_file.xlsx", index=False)
内容的提问来源于stack exchange,提问作者Antti Ellonen
相关产品推荐
相关产品推荐

