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.shape或len(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只是读入时的推断。

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