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
相关产品推荐
相关产品推荐

