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

Pandas批量统计多Excel分类计数汇总导出异常排查

问题根因排查
  • 列定位错误:用iloc按位置索引取category列鲁棒性极差,只要任意文件存在前置空列、隐藏列、读入时自动生成的unnamed索引列,就会取错目标列,直接导致计数结果为空。
  • 循环逻辑错误:大概率是在循环中反复覆盖同一个统计变量,没有把每个文件的统计结果独立存入列表;且value_counts()返回的是索引为分类值的Series,没有做结构转换就直接拼接,会触发pandas的索引对齐机制,最终出现分类值当索引、计数全空、行数等于文件总数、仅显示最后一个文件名的异常表现。
  • 边界处理缺失:没有过滤最终要导出的results.xlsx文件,重复运行时会把汇总文件本身也纳入处理范围,进一步干扰结果。
正确实现代码
import pandas as pd
import glob
import os

# 获取当前目录下所有xlsx文件路径,过滤掉最终生成的结果文件避免循环读入
file_paths = glob.glob("*.xlsx")
file_paths = [f for f in file_paths if os.path.basename(f) != "results.xlsx"]

all_stats = []

for path in file_paths:
    # 直接按列名读取目标列,彻底规避iloc位置偏移的取数错误
    df = pd.read_excel(path, usecols=["category"])
    # 可选:如果存在列名带前后空格的情况,放开下面这行做列名清洗
    # df.columns = df.columns.str.strip()
    
    # 统计当前文件各分类出现次数,转换为标准二维表结构
    count_res = df["category"].value_counts(dropna=True).reset_index()
    count_res.columns = ["category", "count"]
    # 绑定当前文件名作为来源标识
    count_res["source_file"] = os.path.basename(path)
    all_stats.append(count_res)

# 拼接所有文件的统计结果
final_long = pd.concat(all_stats, ignore_index=True)
# 转换为宽表格式:行=文件名,列=分类值,值=出现次数,缺失值填0
final_wide = final_long.pivot(
    index="source_file", 
    columns="category", 
    values="count"
).fillna(0).reset_index()

# 导出汇总结果,需要长表格式就替换为final_long
final_wide.to_excel("results.xlsx", index=False)
调整说明
  • 代码默认导出宽表格式,符合常规汇总查看习惯,如果需要保留「文件名-分类-计数」的长表结构,导出时替换对应变量即可。
  • 如果需要统计category列为空的条目数量,把value_counts()的参数改为dropna=False。
  • 首次运行前建议先拿1个测试文件打印pd.read_excel(测试文件路径).columns,确认category列名无拼写、空格异常,避免读列报错。

内容的提问来源于stack exchange,提问作者r_user

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:09:22