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

Pandas 数据清洗与分析

第一部分:水果销售分析(入门篇)

首先,我们有一个简单的水果销售列表。我们的任务是算出每种水果的总销量,以及每天的销售明细。

1. 数据准备我们先造一点数据:
import pandas as pd import numpy as np data = { '日期': ['2025-03-01', '2025-03-01', '2025-03-01', '2025-03-02', '2025-03-02', '2025-03-02', '2025-03-03', '2025-03-03', '2025-03-03', '2025-03-04', '2025-03-04', '2025-03-04', '2025-03-05', '2025-03-05', '2025-03-05', '2025-03-06', '2025-03-06', '2025-03-06'], '水果种类': ['苹果', '香蕉', '橙子', '苹果', '香蕉', '葡萄', '苹果', '橙子', '葡萄', '香蕉', '橙子', '葡萄', '苹果', '香蕉', '橙子', '苹果', '香蕉', '葡萄'], '销售数量(斤)': [15, 10, 8, 12, 18, 10, 20, 15, 12, 14, 10, 8, 18, 16, 12, 10, 11, 9], '销售金额(元)': [75, 30, 40, 60, 54, 50, 100, 75, 60, 42, 50, 40, 90, 48, 60, 50, 33, 45] } df1 = pd.DataFrame(data)
2. 分组统计 (Groupby)

需求:算算每种水果总共卖了多少斤,收了多少钱?
大白话:把相同的水果堆在一起,把它们的数量和钱数加起来。

# 按"水果种类"分组,对数量和金额求和 result1 = df1.groupby('水果种类').sum() print(result1)

输出结果

  • 苹果:卖了 75 斤,收了 375 元。
  • 香蕉:卖了 69 斤,收了 207 元。
  • 橙子:卖了 45 斤,收了 225 元。
  • 葡萄:卖了 39 斤,收了 195 元。
3. 透视表 (Pivot Table)

需求:我想看一张表格,行是日期,列是水果,中间是销量。
大白话:把数据“转”一下,变成交叉报表,没有的数据显示为0。

# index=行,columns=列,values=值,fill_value=空值填0 result2 = df1.pivot_table(index='日期', columns='水果种类', values='销售数量(斤)', fill_value=0) print(result2)

效果:你会得到一张 6天 x 4种水果 的表格,一眼就能看出哪天卖了什么。


第二部分:校园超市数据清洗(进阶篇)

真实的业务数据(校园超市销售.csv)往往很乱。我们来看看如何清洗它。

1. 数据概览 (info & isnull)

大白话:先给数据做个“体检”。

  • 发现的问题
    • 空值:商品ID缺1个,销售数量缺1个,单价缺2个,支付方式缺3个。
    • 类型错误:数量和单价竟然是“文本”(object),不是数字。
    • 乱码:支付方式里有“微信”、“weixin”、“ZHI FU BAO”混着写。
2. 清洗步骤 (Step-by-Step)

第一步:处理支付方式的乱码
把所有字母转大写,并统一替换为标准名称。

# 统一格式:转大写,并替换掉全大写的拼音 data2['支付方式'] = data2['支付方式'].str.replace('ZHI FU BAO','支付宝').str.upper().str.replace('WEIXIN','微信')

第二步:处理空值 (NaN)
难点:支付方式里有“未记录”,这其实也是空值。
策略

  1. 先把“未记录”转成标准的空值NaN
  2. 单价:用平均值填充。
  3. 支付方式:这里有个坑!如果用“众数”(出现最多的词)填,发现“微信”和“支付宝”一样多。这时候我们用了向前填充 (ffill),也就是用上一笔交易的支付方式来推断这一笔。
# 把"未记录"变成空值 data2['支付方式'] = data2['支付方式'].replace("未记录", float("nan")) # 单价用平均值填 data2['单价(元)'] = data2['单价(元)'].fillna(data2['单价(元)'].mean()) # 支付方式用上一行的值来填 data2['支付方式'] = data2['支付方式'].ffill()

第三步:格式化与类型转换
去掉单价里的“¥”和“元”,并把类型转为浮点数。

# 去掉符号 data2['单价(元)'] = data2['单价(元)'].str.replace('¥','').str.replace('元','').str.strip() # 转成数字类型 data2['单价(元)'] = data2['单价(元)'].astype('float')

第四步:删除异常值
把销售数量小于0的删掉(超市不可能卖出负数)。

data2.drop(data2[data2['销售数量']<0].index, inplace=True)

第三部分:用代码“造”数据(NumPy 随机生成)

有时候为了测试代码,我们需要大量数据。我们可以用代码模拟生成!

1. 模拟需求
  • 时间:2023年1月1日 到 2025年12月20日。
  • 水果:随机选['苹果','香蕉','车厘子','西瓜','榴莲']
  • 用户:随机选['Jack','Tom','Lucy'...]
  • 数量:随机生成 50-100 之间的数字。
2. 核心代码
# 1. 生成日期序列 time_range = pd.date_range(start='1/1/2023', end='20/12/2025') # 2. 定义选项池 fruits = ['苹果','香蕉','车厘子','西瓜','榴莲'] names = ['Jack','Tom','Lucy','Lily','Bob','Mike'] # 3. 随机抽选 (关键函数:np.random.choice) fruits_list = np.random.choice(fruits, size=len(time_range), replace=True) names_list = np.random.choice(names, size=len(time_range), replace=True) # 4. 组合成表格 order = pd.DataFrame({ "时间": time_range, "水果种类": fruits_list, "用户": names_list, "购买数量": np.random.choice(list(range(50,100)), size=len(time_range), replace=True) })
3. 数据可视化(热力图)

用颜色深浅来表示数值大小,一眼看出谁是“大胃王”。

# cmap='Spectral_r' 是配色方案,颜色越深代表数值越大 order.style.background_gradient(cmap='Spectral_r')

总结

今天我们学到了:

  1. 清洗脏数据:处理乱码(统一大小写)、处理空值(平均值填充 vs 向前填充)、删除异常值。
  2. 数据生成:利用numpy.random.choice快速构建测试数据集。
  3. 分析groupby分组求和,pivot_table重塑数据。
http://www.jsqmd.com/news/845355/

相关文章:

  • 2026贵州高考志愿填报与全链条学业规划深度横评:150亿参数AI如何破解高分低就困局 - 精选优质企业推荐官
  • 终极指南:如何使用JPEXS Free Flash Decompiler轻松搞定SWF字体替换
  • 多项式与卷积分析:从系统描述到信号处理的工程实践
  • MAA明日方舟智能辅助工具终极指南:如何一键解放双手,轻松完成全部日常任务
  • 播放器推流Seek就花屏,H.264 GOP 惹的祸
  • 广州空运报关核心技术解析及合规服务商盘点 - 奔跑123
  • Lano Visualizer:如何用开源音频可视化工具在5分钟内打造桌面音乐革命
  • Midscene.js:基于视觉推理的跨平台自动化测试范式革新
  • 2026年GEO排名优化服务商排名稳定性与长效占位能力深度评测报告 - 博客湾
  • 重新定义光学设计:Inkscape光线追踪插件带来的矢量图形仿真新范式
  • 新手避坑指南:用Mission Planner给ArduPilot飞控做硬件校准(附电调校准正确姿势)
  • 2026年5月废水池防腐超声波液位计国产厂家排名 - 水质仪表品牌排行榜
  • 长期项目中使用TaoToken Token Plan套餐的成本控制感受
  • 2026年一站式影视制作工具推荐|一站式影视制作平台选型指南与功能盘点 - 品牌2025
  • 从零到一:手把手教你用Cornerstone.js搭建一个基础的医学影像查看器
  • 15种高级遮罩如何彻底改变你的OBS直播体验?
  • 卡地亚坦克手动上链机芯保养要多少钱?深圳卡地亚高口碑保养收费明细:让你每一分钱都花得明白 - 亨得利官方维修中心
  • 极客实测!2026能云端部署OpenClaw龙虾平台开发向排行 API兼容/工作流自定义/低代码二次开发 - 极欧测评
  • 性能优化必看:你的Unity粒子特效为什么这么卡?从ParticleSystem参数入手排查
  • 2026年贵州高考志愿填报与全链条学业规划深度指南:AI精准赋能如何破解滑档困局 - 精选优质企业推荐官
  • 无王无帝定乾坤,来自田间第一人 凰标重塑新风骨
  • 2026义乌婚纱摄影排名|服务品质与拍摄体验综合测评报告 - charlieruizvin
  • 人工智能的风险与治理需从人机环境系统展开
  • 2026年防潮铸铝门厂家哪家好?10大品牌深度评测与推荐 - Amonic
  • 还在为Linux文件搜索太慢而烦恼?FSearch让文件秒级定位成为现实
  • 成本大降45%:青岛海志啤酒瞬时杀菌机案例解析 - 速递信息
  • 网盘直链解析助手:一站式解决多平台文件下载难题
  • 亨得利高口碑腕表养护服务全体验:为什么20万表友一致推荐?百达翡丽、欧米茄、浪琴等品牌养护实例与预约指南 - 亨得利腕表维修中心
  • 无王无帝定乾坤,来自田间第一人 大道济世安苍生
  • FlatLaf架构解析:现代化Java Swing主题引擎的技术实现与性能优化方案