多份月度税务Excel表格导入清洗与合并DataFrame问题求助
1. 排除红色高亮的冗余文本
要过滤Excel中红色高亮的冗余内容,需借助openpyxl读取单元格字体颜色属性,手动筛选有效行:
- 先安装依赖:
pip install openpyxl pandas - 核心逻辑:遍历工作表每行,检查单元格字体是否为红色(RGB值通常为
FFFF0000,若匹配失败可自行打开Excel查看对应颜色的RGB值),仅保留无红色文本的行。
示例代码:
import openpyxl import pandas as pd def load_clean_excel(file_path, sheet_name='РК'): wb = openpyxl.load_workbook(file_path, data_only=True) ws = wb[sheet_name] valid_rows = [] # 遍历所有行,同时获取单元格对象(用于判断格式)和单元格值 for row_idx, row_values in enumerate(ws.iter_rows(values_only=True), start=1): has_red_text = False # 检查当前行的每个单元格格式 for cell in ws[row_idx]: if cell.font.color and cell.font.color.rgb == 'FFFF0000': has_red_text = True break if not has_red_text: valid_rows.append(row_values) # 转成DataFrame,假设第一行是表头 df = pd.DataFrame(valid_rows[1:], columns=valid_rows[0]) return df
2. 解决合并时仅第一个表格正常、其余为NaN的问题
这个问题基本是因为不同表格列名不统一、数据起始行不一致,或者glob未正确匹配所有文件,按以下步骤修复:
步骤1:确保glob遍历到所有目标文件
检查路径写法,确保递归遍历到各年份文件夹下的所有月度文件:
from glob import glob # 假设年份文件夹都在当前目录下,比如./2009/*.xlsx、./2010/*.xlsx file_paths = glob('./**/*.xlsx', recursive=True) # 打印确认文件数量是否符合预期(每年12个) print(f"共找到{len(file_paths)}个文件")
步骤2:统一列结构后再合并
以第一个表格的列名为基准,对齐所有表格的列,缺失列补NaN,多余列直接丢弃:
# 加载第一个文件作为基准模板 base_df = load_clean_excel(file_paths[0]) standard_columns = base_df.columns.tolist() all_dfs = [base_df] for path in file_paths[1:]: temp_df = load_clean_excel(path) # 强制对齐列名 temp_df = temp_df.reindex(columns=standard_columns) all_dfs.append(temp_df) # 合并所有DataFrame full_year_df = pd.concat(all_dfs, ignore_index=True)
额外排查点
- 若部分表格的表头不在第一行,需调整
load_clean_excel中valid_rows的索引,比如表头在第3行,就用valid_rows[2]作为列名,valid_rows[3:]作为数据。 - 检查Excel文件是否存在隐藏行/列,导致读取异常,可手动打开文件确认数据结构。
内容的提问来源于stack exchange,提问作者Chingis Sauranbayev
相关产品推荐
相关产品推荐

