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

使用Pandas解析Excel时如何处理合并列单元格及Unnamed列?

Pandas解析带合并列头Excel的解决方案

问题场景

原Excel表格存在合并列头xyz_123,对应下方多列数据:

|Student ID|x_1|x_2|xyz_123|
|6677889955|3  |4  |A|B| |D|
|0987654321|1  |4  |A| |C|3|
|1324689764|2  |2  |A|5|C| |

用Pandas解析后,合并列对应的后续列被命名为Unnamed:4、Unnamed:5、Unnamed:6,结构如下:

|Student ID|x_1|x_2|xyz_123|Unnamed:4|Unnamed:5|Unnamed:6|
|6677889955|3  |4  |A      |B        |         |D        |
|0987654321|1  |4  |A      |         |C        |3        |
|1324689764|2  |2  |A      |5        |C        |         |

尝试用fillna()填充列名未达预期,需将这些Unnamed列关联到xyz_123列头并整理数据。

解决方案

方法1:读取时识别合并单元格(推荐)

借助openpyxl引擎读取Excel,先解析表头的合并单元格信息,再重命名列:

import pandas as pd
from openpyxl import load_workbook

# 加载目标Excel文件
wb = load_workbook('your_file.xlsx')
ws = wb.active
header_row_num = 1  # Excel中表头所在行号(openpyxl行号从1开始)

# 收集合并单元格的列名映射关系
col_name_map = {}
for merged_range in ws.merged_cells.ranges:
    # 获取合并单元格的主列名
    main_col_name = ws.cell(row=merged_range.min_row, column=merged_range.min_col).value
    # 给合并范围内的所有列绑定主列名
    for col_idx in range(merged_range.min_col, merged_range.max_col + 1):
        col_name_map[col_idx] = main_col_name

# 读取Excel时跳过表头行,后续手动设置表头
df_raw = pd.read_excel('your_file.xlsx', header=None, skiprows=1)

# 生成新表头列表
new_headers = []
for col_idx in range(1, df_raw.shape[1] + 1):
    if col_idx in col_name_map:
        new_headers.append(col_name_map[col_idx])
    else:
        # 非合并列直接取原表头值
        new_headers.append(ws.cell(row=header_row_num, column=col_idx).value)

# 设置新表头
df_raw.columns = new_headers

# 可选:将同一列名下的多列转为多行,过滤空值
df_clean = df_raw.melt(id_vars=['Student ID', 'x_1', 'x_2'], 
                       var_name='category', value_name='value').dropna(subset=['value'])

方法2:读取后重命名列并整理

如果已读取带Unnamed列的DataFrame,直接处理列名和数据:

import pandas as pd

# 假设df是已读取的目标DataFrame
target_col = 'xyz_123'
# 获取合并列的起始索引
start_col_idx = df.columns.get_loc(target_col)

# 重命名后续的Unnamed列
new_columns = df.columns.tolist()
for idx in range(start_col_idx + 1, len(new_columns)):
    if 'Unnamed' in new_columns[idx]:
        new_columns[idx] = target_col

df.columns = new_columns

# 整理数据:转多行并过滤空值
df_clean = df.melt(id_vars=['Student ID', 'x_1', 'x_2'], 
                   var_name='category', value_name='value').dropna(subset=['value'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:15:55