pandas处理excel单元格合并后的列

本文介绍如何使用Python的pandas库处理Excel中合并的单元格问题,并通过代码示例展示了如何提取时间列并调整列名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日常处理数据时会面临到一种excel数据就是单元格合并,但是在pandas读取的时候会被分位两行读取(意:显示位2行 一行为空值 或者更多)

这里主要讲下单元格合并两行的时候,其他的与之类似

这里有我已经创建好的excel表格
在这里插入图片描述
pandas读取进去后显示为

在这里插入图片描述
这里我做一个要求 希望我们最后的列名为[ID,姓名,性别,年龄,再加上第二行的日期]

# 导入判断时间列的库
import datetime
import pandas as pd
data = pd.read_excel(r'./data/test3.xlsx')
print('输出原始数据: ', data,'\n')
# 取第一行type为datetime的name
time_col = [col for col in data.iloc[0,:].tolist() if type(col) == datetime.datetime]
print('time_col: ', time_col, '\n')
need_cols = data.columns.tolist()[0:4]
print('需要的列名: ', need_cols,'\n')
# 使用列表拼接,得到最终的列
data_all = need_cols + time_col

# 直接进行列名修改
data.columns = data_all
print('修改列名之后: ', data, '\n')

# 这里需要删除第一行
data = data.drop(0)
print('处理完后的数据: ', data, '\n')

运行结果如下图
在这里插入图片描述

这里需要声明的一点,可能有些人觉得没有必要这么麻烦 可以直接使用内置函数reindex(columns=col_list)这种方法

这个函数的前提是较为麻烦的 需要将数据也要按照列取下来 如果碰见很复杂的数据 需要根据列名的索引进行获取的可以 不然会出现下列情况
在这里插入图片描述
reindex函数相当于对列重新组合,所以要求你的新列前提是要有数据的 后面我将更新我在工作中所碰到的问题,当时我是用reindex解决的
如果大家还有更为简单的方法可以给我留言 欢迎讨论

### 使用 Pandas 处理 Excel 中的合并单元 当使用 `pandas` 库来处理包含合并单元Excel 文件时,需要注意的是 `pandas` 并不直接支持读取或写入带有合并单元的信息。然而,可以通过其他库如 `openpyxl` 或者自定义逻辑来间接实现这一功能。 对于读取含有合并单元Excel 文件并将其转换成 DataFrame 的情况: ```python import pandas as pd file_path = 'example_with_merged_cells.xlsx' df = pd.read_excel(file_path, engine='openpyxl') print("原始数据:") print(df) ``` 这段代码会尝试加载指定路径下的 Excel 文件到一个新的 DataFrame 对象中[^2]。但是,默认情况下,`read_excel()` 函数不会保留原表中的任何式化信息(比如合并单元),它只会提取数值内容填充至 DataFrame 表结构里。 为了写出带合并单元效果的新 Excel 文件,则可以采用如下方式: ```python from openpyxl import Workbook from openpyxl.utils.dataframe import dataframe_to_rows from openpyxl.styles import Alignment def write_dataframe_with_merge(df, output_file, merge_columns=None): wb = Workbook() ws = wb.active # 将 DataFrame 写入工作簿 for r in dataframe_to_rows(df, index=False, header=True): ws.append(r) if merge_columns is not None and isinstance(merge_columns, list): prev_values = {} for col_name in merge_columns: column_index = df.columns.get_loc(col_name) + 1 start_row = end_row = None for row_idx, value in enumerate(df[col_name], start=1): cell = ws.cell(row=row_idx+1, column=column_index) if (value != prev_values.get(col_name)) or ((row_idx == len(df)+1)): if start_row is not None: ws.merge_cells(start_row=start_row+1, start_column=column_index, end_row=end_row+1, end_column=column_index) merged_cell = ws[f'{chr(column_index+64)}{start_row+1}'] merged_cell.alignment = Alignment(horizontal="center", vertical="center") start_row = end_row = row_idx elif value == prev_values.get(col_name): end_row += 1 prev_values[col_name] = value wb.save(output_file) # 创建测试用 DataFrame test_df = pd.DataFrame({ "A": ["X", "Y"], "B": [1, 2], }) write_dataframe_with_merge(test_df, "output_with_merged_cells.xlsx", ['A']) ``` 上述函数接受一个 DataFrame (`df`) 及目标文件名作为输入参数,并允许通过可选参数 `merge_columns` 来指明哪些应该被考虑做合并操作。该脚本遍历每一行,在发现连续相同值的情况下就会执行相应的合并动作[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vergil_Zsh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值