小伙伴们是否有过这样的烦恼?领导或同事发来几十份格式相似的销售数据文件(CSV或Excel格式),要求你汇总统计、清洗数据、按月份拆分。如果依然沿用传统方法,在Excel里一个个手动打开、复制粘贴、制作透视表,不仅效率低下、容易出错,还可能因为文件过大导致软件卡顿,加班到深夜都难以完成。
其实,利用Python的Pandas库,只需几行代码就能自动化完成这些重复性劳动。今天,我们就来手把手教你如何从零开始,掌握使用Pandas批量处理CSV和Excel文件的核心技巧,彻底解放你的双手,提升数据分析效率。即便是编程新手,也可以直接复用文中的代码块。
为什么选择Pandas进行批量处理?
在对比Excel等传统工具后,Pandas的优势显而易见:
- Excel:通常一次只能处理一个文件,进行大量重复操作时效率低,且面对海量数据时容易崩溃或卡顿。
- Pandas:可以编写脚本一次性读取成百上千个文件,并支持进行统一的数据清洗、计算、转换和保存,处理速度极快,并能完全杜绝人为操作失误。
环境准备:安装必要的库
开始之前,请确保你的Python环境中已安装Pandas。由于需要处理Excel文件,还需安装对应的引擎库。打开命令行终端,执行以下安装命令:
pip install pandas openpyxl xlrd
pandas:数据分析的核心库。
openpyxl:用于读写新版 .xlsx 格式的Excel文件。
xlrd:用于读取旧版 .xls 格式的Excel文件(如果只处理CSV文件,可不安装)。
在代码开头,导入我们将要使用的库:
import pandas as pd
import glob # 用于查找匹配特定模式的所有文件路径
第一步:批量读取文件(核心技巧)
我们从读取单个文件开始,这是基础,然后轻松升级到批量读取。
1. 读取单个文件
Pandas为不同格式的文件提供了直接的读取函数。
# 读取CSV文件(最常用,参数简单)
df_csv = pd.read_csv("销售数据_1月.csv")
# 读取Excel文件(需指定engine参数以确保兼容性)
df_excel = pd.read_excel("销售数据_2月.xlsx", engine="openpyxl") # .xlsx 文件使用 openpyxl
# df_excel = pd.read_excel("旧版数据.xls", engine="xlrd") # .xls 文件使用 xlrd
# 查看数据前5行,验证读取是否成功
print("CSV文件前5行:")
print(df_csv.head())
print("\nExcel文件前5行:")
print(df_excel.head())
2. 批量读取多个文件(解放双手的关键)
假设你的“销售数据文件夹”内存放了大量格式一致的销售数据_1月.csv、销售数据_2月.csv等文件。使用glob模块可以轻松获取所有文件路径,然后循环读取并合并。
# 步骤1:使用glob查找指定文件夹下的所有CSV文件
file_paths = glob.glob("销售数据文件夹/*.csv") # 匹配“销售数据文件夹”下所有.csv文件
# 若要读取Excel文件,可修改为:glob.glob("销售数据文件夹/*.xlsx")
# 步骤2:循环读取每个文件,并将DataFrame存入列表
df_list = []
for path in file_paths:
df = pd.read_csv(path) # 读取单个文件
# 可选操作:从文件名中提取月份信息,并添加为新列
df["月份"] = path.split("_")[-1].replace(".csv", "")
df_list.append(df)
# 步骤3:使用pd.concat合并列表中的所有DataFrame
total_df = pd.concat(df_list, ignore_index=True) # ignore_index=True 会重置行索引,使其连续
# 查看合并后的数据总览
print(f"合并后共 {len(total_df)} 行数据")
print(total_df.head(10))
关键说明:
glob.glob(“路径/*.csv”):自动扫描并返回所有匹配的文件路径,无需手动输入每个文件名。
pd.concat():这是实现批量处理的核心函数,它将多个数据结构纵向堆叠,合并成一个完整的DataFrame,后续所有操作都基于这个统一的数据集。
第二步:对合并后的数据进行批量处理
现在,所有数据都在total_df这个DataFrame中,我们可以一次性完成各种清洗、计算和转换操作。以下是三个最常用的场景。
场景1:批量数据清洗(去重与缺失值处理)
# 1. 删除完全重复的行
total_df = total_df.drop_duplicates()
# 2. 填充缺失值
total_df["销售额"] = total_df["销售额"].fillna(0) # 数值列用0填充
total_df["客户名称"] = total_df["客户名称"].fillna("未知") # 文本列用“未知”填充
# 3. 统一数据格式(例如,将销售额列转换为整数类型)
total_df["销售额"] = total_df["销售额"].astype(int)
场景2:批量计算统计值(分组聚合)
告别Excel透视表,用一行代码完成月度统计。
# 按“月份”分组,计算每月的总销售额和唯一订单数
monthly_stats = total_df.groupby("月份").agg(
总销售额=("销售额", "sum"),
订单总数=("订单号", "nunique") # nunique 用于统计不重复的个数
).reset_index()
print("每月销售统计:")
print(monthly_stats)
场景3:批量修改与新增数据
# 1. 新增“利润”列(假设利润率为30%)
total_df["利润"] = total_df["销售额"] * 0.3
# 2. 批量修改“地区”列中的值,统一格式
total_df["地区"] = total_df["地区"].str.replace("北京", "北京市")
total_df["地区"] = total_df["地区"].str.replace("上海", "上海市")
第三步:批量保存处理结果
数据处理完毕后,可以根据需求保存为一个汇总文件,或按条件拆分为多个文件。
1. 保存为单个汇总文件
# 保存为CSV格式(通用性好,文件体积小)
total_df.to_csv("合并后的销售数据_2024.csv", index=False) # index=False 表示不保存行索引
# 保存为Excel格式(便于直接展示和汇报)
total_df.to_excel("合并后的销售数据_2024.xlsx", index=False, engine="openpyxl")
print("汇总文件保存成功!")
2. 按条件批量保存为多个文件(例如按月份拆分)
如果需要将处理好的数据按月份拆分开来交给不同部门,也可以轻松实现。
# 按“月份”分组,将每个分组保存为一个独立的Excel文件
for month, group_df in total_df.groupby("月份"):
group_df.to_excel(f"2024年{month}销售数据_处理后.xlsx", index=False, engine="openpyxl")
print("所有月份文件已拆分保存成功!")
运行后,你的文件夹中会自动生成类似 2024年1月销售数据_处理后.xlsx、2024年2月销售数据_处理后.xlsx 的文件。
完整实战案例:一键汇总12个月的销售数据
将上述所有步骤整合,得到一份可直接运行的完整脚本,用于处理“销售数据文件夹”中12个月的CSV文件。
# 完整代码:批量读取 -> 合并 -> 清洗 -> 统计 -> 保存
import pandas as pd
import glob
# 1. 批量读取文件
file_paths = glob.glob("销售数据文件夹/*.csv")
df_list = []
for path in file_paths:
df = pd.read_csv(path)
df["月份"] = path.split("_")[-1].replace(".csv", "") # 从文件名提取月份
df_list.append(df)
# 2. 合并数据
total_df = pd.concat(df_list, ignore_index=True)
# 3. 清洗数据
total_df = total_df.drop_duplicates()
total_df["销售额"] = total_df["销售额"].fillna(0).astype(int)
total_df["客户名称"] = total_df["客户名称"].fillna("未知")
# 4. 统计每月销售情况
monthly_stats = total_df.groupby("月份").agg(
总销售额=("销售额", "sum"),
订单总数=("订单号", "nunique")
).reset_index()
# 5. 保存结果
total_df.to_csv("合并后销售数据_2024.csv", index=False)
monthly_stats.to_excel("每月销售统计_2024.xlsx", index=False, engine="openpyxl")
print("批量处理完成!已生成两个文件:合并后销售数据_2024.csv、每月销售统计_2024.xlsx")
作为新手,你只需要修改 glob.glob(“销售数据文件夹/*.csv”) 中的文件夹路径,即可直接运行此脚本,轻松应对数十甚至上百份数据文件的处理任务。
新手常见问题与避坑指南
- 文件路径错误:如果代码报错“FileNotFoundError”,请检查文件路径是否正确。可将数据文件放在与脚本相同的目录下,或使用绝对路径(例如
“C:/Users/YourName/Desktop/销售数据/*.csv”)。
- Excel引擎混淆:读取
.xlsx 文件时,engine 参数应指定为 “openpyxl”;读取旧的 .xls 文件时,则指定为 “xlrd”。
- 数据格式不一致:在批量读取前,请确保所有源文件的列名、列顺序是一致的,否则合并时可能出现错位或错误。
- 中文乱码问题:读取CSV文件时若出现中文乱码,可以在
pd.read_csv() 中添加编码参数尝试解决,如 pd.read_csv(path, encoding=‘utf-8’) 或 pd.read_csv(path, encoding=‘gbk’)。
总结
使用Pandas进行批量文件处理的核心逻辑可以概括为:“批量读取 -> 合并 -> 统一处理 -> 批量保存”。整个过程无需人工干预任何一个单独文件,将重复性劳动转化为可复用的自动化脚本。
建议初学者先从“批量读取与合并”入手,成功运行后再逐步添加数据清洗、统计分析等功能模块。掌握这项技能后,下次再面对堆积如山的报表文件,你只需运行一遍脚本,几分钟内就能得到整洁、准确的结果,大幅提升工作效率。如果你对这类数据处理技巧感兴趣,欢迎到 云栈社区 探索更多实战教程和交流心得。