如何按共享值将Excel单列重组为多列DataFrame?能否用unstack?
将分块Excel表格转换为宽格式DataFrame的最简方法
核心思路
无需拆分读取多个区域,可通过一次性读取全表后识别分块、合并再转格式实现,完全可以用unstack完成目标转换。
具体实现步骤
假设你的Excel文件名为data.xlsx,使用pandas处理的代码如下:
- 读取全表(保留所有行,包括空行和分隔线)
import pandas as pd # header=None 避免自动识别表头,我们手动处理 raw_df = pd.read_excel("data.xlsx", header=None)
- 识别各数据块的表头行与数据范围
# 定位所有包含"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:用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
相关产品推荐
相关产品推荐

