> 技术文档 > 用 Python 批量处理 Excel:从重复值清洗到数据可视化

用 Python 批量处理 Excel:从重复值清洗到数据可视化


引言

日常工作中,经常需要处理多份 Excel 表格:比如合并销售数据、清洗重复的用户信息,最后生成可视化图表。手动操作不仅效率低,还容易出错。这篇文章分享一套 Python 自动化流程,用pandasmatplotlib搞定从数据清洗到可视化的全流程,附完整代码和避坑指南。

一、环境准备

需要安装的库:

pip install pandas openpyxl matplotlib # openpyxl用于读取xlsx格式

避坑点:如果 Excel 是.xls格式,需额外安装xlrd==1.2.0(高版本不支持 xls)。

二、核心步骤(附代码)
1. 读取并合并多份 Excel 文件

假设文件夹data/下有 3 个销售数据文件(sale1.xlsxsale2.xlsxsale3.xlsx),结构相同(含 “日期”“产品”“销售额” 列)。

import pandas as pdimport os# 读取文件夹下所有Excelfile_dir = \"data/\"all_data = []for file in os.listdir(file_dir): if file.endswith(\".xlsx\"): df = pd.read_excel(os.path.join(file_dir, file)) all_data.append(df)# 合并为一个DataFramemerged_df = pd.concat(all_data, ignore_index=True)print(f\"合并后共{len(merged_df)}行数据\")
2. 清洗重复值

目标:删除 “产品 + 日期” 完全重复的行(避免重复统计)。

# 查看重复值数量print(f\"重复值行数:{merged_df.duplicated(subset=[\'产品\', \'日期\']).sum()}\")# 删除重复值(保留第一行)cleaned_df = merged_df.drop_duplicates(subset=[\'产品\', \'日期\'], keep=\'first\')
3. 缺失值处理

如果 “销售额” 列有缺失,用该产品的平均值填充(比直接删除更合理):

# 按“产品”分组,用组内平均值填充缺失值cleaned_df[\'销售额\'] = cleaned_df.groupby(\'产品\')[\'销售额\'].transform( lambda x: x.fillna(x.mean()))
4. 数据可视化(生成销量趋势图)

以 “产品 A” 为例,绘制月度销售额折线图:

import matplotlib.pyplot as plt# 设置中文显示(避免乱码)plt.rcParams[\"font.family\"] = [\"SimHei\", \"WenQuanYi Micro Hei\", \"Heiti TC\"]# 筛选产品A的数据,按月份分组求和product_a = cleaned_df[cleaned_df[\'产品\'] == \'产品A\']product_a[\'月份\'] = product_a[\'日期\'].dt.to_period(\'M\') # 提取月份monthly_sales = product_a.groupby(\'月份\')[\'销售额\'].sum()# 绘图monthly_sales.plot(kind=\'line\', figsize=(10, 6))plt.title(\'产品A月度销售额趋势\')plt.xlabel(\'月份\')plt.ylabel(\'销售额(元)\')plt.grid(alpha=0.3)plt.savefig(\'sales_trend.png\', dpi=300) # 保存图片plt.show()
三、完整代码总结

将上述步骤整合为一个函数,方便复用:

def process_excel(file_dir, target_product): # 1. 读取合并数据(代码同上) # 2. 清洗重复值(代码同上) # 3. 处理缺失值(代码同上) # 4. 可视化(代码同上) return cleaned_df # 返回处理后的DataFrame# 调用示例df = process_excel(\"data/\", \"产品A\")
四、扩展思考
  • 如果数据量超过 10 万行,建议用dask替代pandas,避免内存溢出;
  • 可视化也可以尝试seaborn,图表更美观(如sns.lineplot())。
  • 你在处理 Excel 时遇到过哪些棘手问题?欢迎留言分享你的解决方案~