当前位置: 首页 > news >正文

用 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 pd
import os# 读取文件夹下所有Excel
file_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)# 合并为一个DataFrame
merged_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 时遇到过哪些棘手问题?欢迎留言分享你的解决方案~
http://www.lryc.cn/news/610816.html

相关文章:

  • Go语言实战案例:使用context控制协程取消
  • 【工程化】tree-shaking 的作用以及配置
  • 小杰数据结构——题库——拂衣便欲沧海去,但许明月随吾身
  • EP02:【DL 第二弹】张量的索引、分片、合并以及维度调整
  • WWDC 25 极地冰原撸码危机:InlineArray 与 Span 的绝地反击
  • 基于MCP的智能客服系统:知识库与工单系统深度集成
  • C++ 网络编程入门:TCP 协议下的简易计算器项目
  • 面向对象编程基础:类的实例化与对象内存模型详解
  • 什么是mysql的垂直分表,理论依据是什么,如何使用?
  • 单链表应用实践
  • 【PCIE044】基于 JFM7VX690T 的全国产化 FPGA 开发套件
  • FPGA 基本设计思想--乒乓操作、串并转换、流水线
  • 数学建模算法-day[15]
  • 【MATLAB】(八)矩阵
  • 技术与情感交织的一生 (十一)
  • HTTP 与 HTTPS 的区别深度解析:从原理到实践
  • kettle插件-kettle http post plus插件,轻松解决https post接口无法调用文件流下载问题
  • 攻击实验(ARP欺骗、MAC攻击、报文洪水攻击、DNS欺骗)
  • 在 MCP 中实现 “askhuman” 式交互:原理、实践与开源方案
  • 灰色优选模型及算法MATLAB代码
  • 信息安全概述--实验总结
  • TCP如何实现可靠传输?实现细节?
  • 三极管基本放大电路静态及动态参数计算
  • 原生CSS vs LESS:样式表语言的进化之旅
  • 笔记学习杂记
  • (ZipList入门笔记二)为何ZipList可以实现内存压缩,可以详细介绍一下吗
  • 第19章 枚举器和迭代器 笔记
  • Spring小细节
  • MySQL连接解决:“Host is not allowed to connect to this MySQL server”错误详解
  • HTML总结全览