我的知识记录

Python Excel统计每行列数与非空单元格

用pandas统计Excel每列非空值数量、缺失率、总行数总列数,快速体检数据质量,输出数据质量报告。

场景痛点

拿到一张表先要摸清楚:总共有多少行多少列?哪些列缺了一大半?哪些列全是空的?手工点来点点不清。用pandas几行代码出一份数据质量报告,决定要不要清洗。

用到的库

pip install pandas openpyxl

完整代码

import pandas as pd

def data_health_report(input_file, output_file=None):
df = pd.read_excel(input_file)
total_rows = len(df)
total_cols = len(df.columns)

print(f"总行数: {total_rows}")
print(f"总列数: {total_cols}")
print(f"列名: {list(df.columns)}")
print("-" * 50)

# 逐列统计
report_rows = []
for col in df.columns:
non_null = df[col].notna().sum()           # 非空数量
null_count = df[col].isna().sum()          # 空值数量
null_rate = null_count / total_rows * 100 # 空值率
unique_count = df[col].nunique(dropna=True) # 去重后个数
dtype = str(df[col].dtype)

report_rows.append({
"列名": col,
"数据类型": dtype,
"非空数量": non_null,
"空值数量": null_count,
"空值率%": round(null_rate, 2),
"去重后个数": unique_count
})

print(f"[{col}] 类型={dtype} 非空={non_null} 空值={null_count} 空值率={null_rate:.1f}% 唯一值={unique_count}")

# 保存报告
if output_file:
report_df = pd.DataFrame(report_rows)
report_df.to_excel(output_file, index=False)
print(f"\n报告已保存: {output_file}")

if __name__ == "__main__":
data_health_report("./销售明细.xlsx", "./数据质量报告.xlsx")

代码讲解

  • df.shapelen(df) / len(df.columns) 拿总行数总列数。
  • df[col].notna().sum() 数非空单元格;isna().sum() 数空值。
  • 空值率 = 空值数 / 总行数 × 100,一眼看出哪列缺得多。
  • nunique(dropna=True) 数去重后有多少个不同值,主键列应该等于总行数。
  • 报告写成Excel方便发给同事看。

运行结果

控制台逐列打印统计,同时生成 数据质量报告.xlsx,每行一列的健康指标,空值率高的列重点检查。

注意事项

  • pandas读空单元格默认是NaN,notna() 把空字符串、空格也当作有值;如果要把空格也算空,先 df.replace(r'^\s*$', pd.NA, regex=True)
  • 数字列里空值会被识别成float,整数列变成float64是正常现象,不影响统计。
  • 时间列建议单独 pd.to_datetime 检查能否解析成功,这里的dtype只是读入时的推断。

Python Excel统计每行列数与非空单元格

标签:

更新时间:2026-09-15 09:11:41

上一篇:Python Excel数据清洗 去除空格特殊字符

下一篇:Python Excel 统计人数频次生成分类汇总方法