Python遍历Excel工作表统计首列非NaN值数量的实现问题
需求说明
- 基于Python实现Excel文件遍历逻辑:扫描文件内所有工作表,统计每个工作表第一列(A列)的非NaN值总数
- 最终输出两列统计结果:工作表名称、对应非NaN值总数,适配A列表头、工作表名称均未知的场景
- 预期效果:
输入样例(跨工作表的A列内容):
输出样例:Column A 所属工作表 Non-NaN0 sh1 Non-NaN1 sh1 Non-NaN2 sh2sheet total sh1 2 sh2 1
原有代码问题排查
第一版代码错误点
- 硬编码
skiprows=[0,1,2,3,4]跳过前5行没有业务依据,会误删有效数据,需求没有要求跳过固定行 - 执行
dfSheetValues = dfSheetValues.iloc[:, 0]后得到的是一维Series对象,后续逐行给Series加SheetNames、TotalNonNaN列会触发索引对齐问题;且dfSheetValues['SheetNames'].count缺少调用括号,没有实际执行计数方法,只是传入了函数对象,导致统计列全为NaN - 逻辑冗余:每个工作表只需要输出一行统计结果,不需要逐行存储工作表名和计数值再做拼接,会产生大量重复无效数据
第二版代码错误点
df.to_frame()是Series转DataFrame的方法,pd.read_excel读取得到的本身就是DataFrame对象,该调用完全多余,且该方法不支持原地修改,写后无任何实际效果- pandas不存在
.char属性,字符串处理接口为.str,且统计非空值不需要调用字符串处理接口 - 未指定统计第一列,默认会统计所有列的空值,不符合需求
正确实现代码
先安装依赖:pip install pandas openpyxl(openpyxl是pandas读取xlsx文件的默认引擎)
import pandas as pd # 替换为你的实际文件路径 input_path = "C:/file/path/File.xlsx" output_path = "C:/file/path/stat_result.csv" # 读取所有工作表,返回格式为 {工作表名: 对应DataFrame} sheet_dict = pd.read_excel(input_path, sheet_name=None) result_list = [] for sheet_name, sheet_df in sheet_dict.items(): # 固定取第一列,调用count()自动统计非NaN值数量 first_col_non_nan = sheet_df.iloc[:, 0].count() result_list.append({ "sheet": sheet_name, "total": first_col_non_nan }) # 组装为最终统计结果表 result_df = pd.DataFrame(result_list) # 打印预览、导出CSV print(result_df) result_df.to_csv(output_path, index=False)
实现说明
- 不依赖A列表头、工作表名称,固定按位置取第一列统计,适配未知表头、未知表名的场景
- 没有硬编码跳过行逻辑,完整读取所有工作表内容,不会误删有效数据
- 每个工作表仅聚合输出一行统计结果,输出格式完全匹配预期,无冗余数据
- 直接使用pandas内置
count()方法统计非空值,逻辑简洁,避免自定义统计的边界错误
内容的提问来源于stack exchange,提问作者feelsgood
相关产品推荐
相关产品推荐

