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

Python遍历Excel工作表统计首列非NaN值数量的实现问题

需求说明
  • 基于Python实现Excel文件遍历逻辑:扫描文件内所有工作表,统计每个工作表第一列(A列)的非NaN值总数
  • 最终输出两列统计结果:工作表名称、对应非NaN值总数,适配A列表头、工作表名称均未知的场景
  • 预期效果:
    输入样例(跨工作表的A列内容):
    Column A          所属工作表
    Non-NaN0          sh1
    Non-NaN1          sh1
    Non-NaN2          sh2
    
    输出样例:
    sheet            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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:45:38