如何将数据透视表父行的子行数据合并至同一行?
实现父行与子行数据合并的方案
一、Excel中的实现方法
方法1:公式组合法
- 假设目标数据在A列,父行是粗体格式,子行为后续非粗体年份。
- 先添加辅助列(比如B列),在B2单元格输入公式并下拉填充:
这一步会标记出所有父行内容,子行则留空。=IF(CELL("fontbold",A2)=TRUE,A2,"") - 再添加目标列(比如C列),在C2单元格输入公式(注意把
A$2:A$100替换成你的实际数据范围):
这个公式会在父行位置自动合并后续所有子行的年份,直到下一个父行出现。=IF(CELL("fontbold",A2)=TRUE,TEXTJOIN(", ",TRUE,OFFSET(A2,1,0,COUNTA(A$2:A$100)-MATCH(A2,A$2:A$100,0),1)),"") - 最后筛选C列不为空的行,就是整理后的目标数据。
方法2:Power Query法
- 选中数据区域,点击「数据」选项卡→「从表格/区域」,进入Power Query编辑器。
- 添加自定义列判断每行是否为父行:
= Table.AddColumn(源, "是否父行", each Cell.Font.Bold) - 按以下步骤操作:
- 使用「填充」→「向下」,将父行标签填充到下方所有子行对应的行中。
- 筛选出子行(「是否父行」为FALSE),按父行标签分组,合并年份列的内容。
- 将分组后的子行数据与父行数据合并,导出即可得到目标格式。
二、Python中的实现方法
需要依赖pandas和openpyxl库,先通过pip install pandas openpyxl安装。
步骤1:读取数据并识别父行
import pandas as pd from openpyxl import load_workbook # 加载你的Excel文件 wb = load_workbook("你的文件路径.xlsx") ws = wb.active # 提取A列数据和对应单元格的粗体标记 data_list = [] bold_flag = [] for row_num in range(2, ws.max_row + 1): cell_value = ws.cell(row=row_num, column=1).value is_bold = ws.cell(row=row_num, column=1).font.bold data_list.append(cell_value) bold_flag.append(is_bold) # 转为DataFrame格式 df = pd.DataFrame({"内容": data_list, "是否父行": bold_flag})
步骤2:合并子行到对应父行
# 把父行标签向下填充,让每个子行都匹配到对应的父行 df["父行标签"] = df.loc[df["是否父行"], "内容"].ffill() # 按父行标签分组,合并子行的年份内容 child_merged = df[~df["是否父行"]].groupby("父行标签")["内容"].agg(", ".join).reset_index() # 筛选父行数据,与合并后的子行数据关联 parent_data = df[df["是否父行"]][["内容"]].rename(columns={"内容": "父行标签"}) final_result = pd.merge(parent_data, child_merged, on="父行标签", how="left") # 重命名列并导出结果 final_result.columns = ["父行", "合并子行年份"] final_result.to_excel("整理后数据.xlsx", index=False)
内容的提问来源于stack exchange,提问作者chickenbutt
相关产品推荐
相关产品推荐

