如何使用Pandas的parse函数处理Excel中的合并单元格?
处理带合并单元格的Excel转DataFrame问题
当Excel存在合并行/列时,pandas默认读取会出现NaN值和Unnamed列,核心原因是合并单元格仅在左上角保留有效值,其余位置为空,且表头解析逻辑不识别合并列的层级结构。以下是具体解决方法:
1. 依赖准备
先确保安装必要工具库:
pip install pandas openpyxl
2. 处理合并行(纵向单元格合并)
合并行的NaN是因为合并区域仅首行有值,其余行无数据。我们可以通过openpyxl获取合并单元格的范围,批量填充对应值:
import pandas as pd from openpyxl import load_workbook def fill_merged_rows(df, sheet): # 获取当前sheet所有合并单元格的范围 merged_cells = sheet.merged_cells.ranges for merged_range in merged_cells: # 解析合并区域的起止行、列(Excel行/列从1开始) start_row, end_row = merged_range.min_row, merged_range.max_row start_col, end_col = merged_range.min_col, merged_range.max_col # 获取合并单元格的有效值(左上角单元格) fill_value = sheet.cell(row=start_row, column=start_col).value # 对应填充到DataFrame(DataFrame索引从0开始,需做偏移) df.iloc[start_row-2:end_row-1, start_col-1:end_col] = fill_value return df # 读取Excel文件 wb = load_workbook('test.xlsx') target_sheet = wb['Feuille 1'] df = pd.read_excel('test.xlsx', sheet_name='Feuille 1', header=0) # 填充合并行的NaN值 df = fill_merged_rows(df, target_sheet)
3. 处理合并列(横向单元格合并)
Unnamed列是因为合并列的表头仅首列有值,其余列被pandas标记为Unnamed。我们可以通过读取Excel原始表头行,填充缺失的列名:
def fix_merged_columns(df, sheet): # 获取Excel表头行(假设表头在第1行,根据实际结构调整行号) header_cells = sheet[1] col_names = [] current_header = None for cell in header_cells: # 遇到非空值则更新当前表头,否则沿用之前的表头 if cell.value is not None: current_header = cell.value col_names.append(current_header) # 重新设置DataFrame的列名 df.columns = col_names return df # 修复合并列的Unnamed问题 df = fix_merged_columns(df, target_sheet)
4. 批量处理多个表格
如果文件包含大量sheet,可通过循环批量处理:
def batch_process_excel(file_path): wb = load_workbook(file_path) processed_dfs = [] for sheet_name in wb.sheetnames: sheet = wb[sheet_name] df = pd.read_excel(file_path, sheet_name=sheet_name, header=0) # 依次处理合并行和合并列 df = fill_merged_rows(df, sheet) df = fix_merged_columns(df, sheet) processed_dfs.append(df) return processed_dfs # 批量处理所有sheet all_processed_dfs = batch_process_excel('test.xlsx')
注意事项
- 若表头不在第1行,需调整
pd.read_excel的header参数,以及header_cells = sheet[X]中的X值 - 遇到复杂嵌套合并(合并行+合并列交叉),需根据实际表格结构微调填充逻辑
- 大数据量场景下,openpyxl的遍历效率足够支撑处理需求
内容的提问来源于stack exchange,提问作者RMB
相关产品推荐
相关产品推荐

