Pandas计算多DataFrame列统计量后,如何写入Excel生成规整统计矩阵
现有实现方案的核心问题
- 第一份尝试的代码中,统计值被存入了
Data变量,但导出时调用的是df1.to_excel,完全没有将计算好的统计值纳入导出对象,最终导出的内容和预期统计结果无关。 - 第二份手动构造DataFrame的代码中,所有单元格填充的是
x0/y0/z0这类占位字符串,没有将实际计算出的x53、y53等真实统计值填入,导出的全是无意义的占位文本。 - 第三份用xlwt写单元格的方案需要手动匹配行号列号写入值,随着待统计的DataFrame数量增多,不仅容易写错位置,还会遇到旧版xlwt对新xlsx格式的兼容问题。
正确的实现逻辑
首先避开零散写单元格、硬编码占位符的思路,先把所有分散的统计值统一规整为有清晰行列的结构化DataFrame,再直接调用Pandas的to_excel方法导出即可,后续新增统计项时也不需要重复修改导出逻辑。
需要提前注意Pandas计算的细节:.mode()方法默认返回的是Series结构,不是单个数值,直接存入导出对象容易引发类型错误,需要先取众数序列的第一个值转为普通数值。
可直接复用的代码实现
- 先定义通用统计工具函数,避免重复编写max、min、mean、mode的计算逻辑:
import pandas as pd def calc_stats(df, target_col): # 为未命名的DataFrame自动生成来源标识 source_name = df.name if hasattr(df, "name") else "未命名数据源" return { "数据来源": source_name, "目标列名": target_col, "最大值": df[target_col].max(), "最小值": df[target_col].min(), "平均值": round(df[target_col].mean(), 4), "众数": df[target_col].mode().iloc[0] }
- 给已有的过滤后DataFrame加上来源标识,批量收集所有统计条目,拼成规整的统计矩阵:
# 给你的df7、df8加来源标识,避免后续分不清哪组值来自哪个表 df7.name = "过滤后df7" df8.name = "过滤后df8" # 批量收集所有需要导出的统计项 stats_entries = [ calc_stats(df8, "Header1"), # 对应你之前计算的x53/y53/z53/k53 calc_stats(df7, "Header2") # 对应你之前计算的x55/y55/z55/k55 ] # 转成结构化的统计矩阵 stats_matrix = pd.DataFrame(stats_entries)
- 调用Pandas的Excel写入器导出文件,还可以把原过滤后的源数据和统计结果存在同一个工作簿的不同sheet下:
with pd.ExcelWriter("统计结果汇总.xlsx") as excel_writer: # 第一个sheet存规整好的统计矩阵 stats_matrix.to_excel(excel_writer, sheet_name="统计值汇总", index=False) # 按需把原始过滤数据存入对应sheet df8.to_excel(excel_writer, sheet_name="df8源数据", index=False) df7.to_excel(excel_writer, sheet_name="df7源数据", index=False)
导出结果的扩展说明
- 生成的“统计值汇总”sheet是完全规整的矩阵表格,后续新增待统计的DataFrame时,只需要在
stats_entries列表里追加一行calc_stats(新的DataFrame, "对应目标列名")即可,不需要修改导出逻辑。 - 如果某列存在多个众数,只需要把众数计算行的代码改为
df[target_col].mode().tolist(),即可将所有众数存入对应单元格,不会出现类型报错。
内容的提问来源于stack exchange,提问作者edward
相关产品推荐
相关产品推荐

