使用Pandas为指定范围非空单元格添加子串,优化OpenPyXL低效问题
用Pandas高效处理大Excel文件的解决方案
核心思路
放弃OpenPyXL逐单元格循环的低效方式,改用Pandas的矢量化操作——底层基于C实现,能把8000行200列的处理时间压缩到几秒内。核心逻辑是先从Main_col拆分出固定前缀和时间片段,再批量处理目标列的非空单元格。
步骤详解与代码实现
- 读取目标Excel数据
按需求跳过前4行(从第5行开始加载数据),保留空值避免自动填充干扰。 - 拆分
Main_col关键信息
从Main_col中拆分出前缀(_之前的内容,如cas1 1)和时间部分(_之后的内容,如05.04.2024 16:40)。 - 批量修改目标列
对第2列(Excel列号)及以后的列,仅针对非空单元格按{原内容}_{时间片段}.{前缀}格式拼接。
完整代码:
import pandas as pd # 读取Excel:skiprows=4 跳过前4行(从第5行开始加载数据),header=0 以第5行为表头 # 若你的表头在第1行、数据从第5行开始,改用 skiprows=range(1,4), header=0 df = pd.read_excel("your_input_file.xlsx", skiprows=4, header=0) # 拆分Main_col,提取前缀和时间部分 df[["prefix", "time_part"]] = df["Main_col"].str.split("_", n=1, expand=True) # 确定目标列:从第2列(Excel列号)开始,对应Pandas中索引1之后的列 target_cols = df.columns[1:] # 批量处理非空单元格:矢量化操作替代逐行循环 for col in target_cols: df[col] = df.apply( lambda row: f"{row[col]}_{row['time_part']}.{row['prefix']}" if pd.notna(row[col]) and str(row[col]).strip() != "" else row[col], axis=1 ) # 删除临时生成的辅助列 df = df.drop(columns=["prefix", "time_part"]) # 保存处理后的文件 df.to_excel("your_output_file.xlsx", index=False)
关键优化点
- 矢量化操作:Pandas的批量处理逻辑避免了逐单元格遍历,效率比OpenPyXL循环提升几个数量级。
- 精准空值判断:用
pd.notna()结合strip()准确识别有效非空单元格,避免无效计算。 - 预拆分复用:提前拆分
Main_col的结果,避免循环中重复拆分,进一步降低耗时。
注意事项
- 若需保留原Excel格式,可在保存时指定
engine="openpyxl",核心处理逻辑无需改动。 - 若表头位置或数据起始行与示例不同,调整
read_excel的skiprows和header参数即可。
内容的提问来源于stack exchange,提问作者Davide C.
相关产品推荐
相关产品推荐

