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

如何按共享值将Excel单列重组为多列DataFrame?能否用unstack?

将分块Excel表格转换为宽格式DataFrame的最简方法

核心思路

无需拆分读取多个区域,可通过一次性读取全表后识别分块、合并再转格式实现,完全可以用unstack完成目标转换。

具体实现步骤

假设你的Excel文件名为data.xlsx,使用pandas处理的代码如下:

  1. 读取全表(保留所有行,包括空行和分隔线)
import pandas as pd
# header=None 避免自动识别表头,我们手动处理
raw_df = pd.read_excel("data.xlsx", header=None)
  1. 识别各数据块的表头行与数据范围
# 定位所有包含"x"的表头行(即每个块的第一行)
header_indices = raw_df[raw_df[0] == "x"].index.tolist()
data_blocks = []

for idx in range(len(header_indices)):
    start_row = header_indices[idx]
    # 确定当前块的结束行:下一个表头行的前2行(跳过空行和分隔线),或表的最后一行
    end_row = header_indices[idx+1] - 2 if idx < len(header_indices)-1 else len(raw_df)-1
    # 提取当前块的数据,设置对应列名(比如a/b/c)
    block = raw_df.loc[start_row+2 : end_row, :]
    block.columns = ["x", raw_df.loc[start_row, 1]]
    data_blocks.append(block)
  1. 合并块并转换为目标格式

方法1:用pivot(更直观)

combined_df = pd.concat(data_blocks, ignore_index=True)
result = combined_df.pivot(index="x", columns=combined_df.columns[1], values=combined_df.columns[1]).reset_index()
# 清除列名的层级标签
result.columns.name = None

方法2:用unstack(满足你的需求)

combined_df = pd.concat(data_blocks, ignore_index=True)
# 设置复合索引后unstack,将列名转为表头
result = combined_df.set_index(["x", combined_df.columns[1]])[combined_df.columns[1]].unstack().reset_index()
result.columns.name = None

注意事项

  • 如果Excel中的分隔线(-----)不存在或格式不同,需调整start_row+2的偏移量(比如分隔线不存在时改为start_row+1)
  • 若空行存在非空单元格,可修改表头行的识别条件为raw_df[raw_df[0].notna() & (raw_df[0] == "x")]

内容的提问来源于stack exchange,提问作者Kevin345

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:12:47