第一部分水果销售分析入门篇首先我们有一个简单的水果销售列表。我们的任务是算出每种水果的总销量以及每天的销售明细。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_value0) 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)难点支付方式里有“未记录”这其实也是空值。策略先把“未记录”转成标准的空值NaN。单价用平均值填充。支付方式这里有个坑如果用“众数”出现最多的词填发现“微信”和“支付宝”一样多。这时候我们用了向前填充 (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, inplaceTrue)第三部分用代码“造”数据NumPy 随机生成有时候为了测试代码我们需要大量数据。我们可以用代码模拟生成1. 模拟需求时间2023年1月1日 到 2025年12月20日。水果随机选[苹果,香蕉,车厘子,西瓜,榴莲]。用户随机选[Jack,Tom,Lucy...]。数量随机生成 50-100 之间的数字。2. 核心代码# 1. 生成日期序列 time_range pd.date_range(start1/1/2023, end20/12/2025) # 2. 定义选项池 fruits [苹果,香蕉,车厘子,西瓜,榴莲] names [Jack,Tom,Lucy,Lily,Bob,Mike] # 3. 随机抽选 (关键函数np.random.choice) fruits_list np.random.choice(fruits, sizelen(time_range), replaceTrue) names_list np.random.choice(names, sizelen(time_range), replaceTrue) # 4. 组合成表格 order pd.DataFrame({ 时间: time_range, 水果种类: fruits_list, 用户: names_list, 购买数量: np.random.choice(list(range(50,100)), sizelen(time_range), replaceTrue) })3. 数据可视化热力图用颜色深浅来表示数值大小一眼看出谁是“大胃王”。# cmapSpectral_r 是配色方案颜色越深代表数值越大 order.style.background_gradient(cmapSpectral_r)总结今天我们学到了清洗脏数据处理乱码统一大小写、处理空值平均值填充 vs 向前填充、删除异常值。数据生成利用numpy.random.choice快速构建测试数据集。分析groupby分组求和pivot_table重塑数据。
Pandas 数据清洗与分析
发布时间:2026/5/19 14:18:35
第一部分水果销售分析入门篇首先我们有一个简单的水果销售列表。我们的任务是算出每种水果的总销量以及每天的销售明细。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_value0) 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)难点支付方式里有“未记录”这其实也是空值。策略先把“未记录”转成标准的空值NaN。单价用平均值填充。支付方式这里有个坑如果用“众数”出现最多的词填发现“微信”和“支付宝”一样多。这时候我们用了向前填充 (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, inplaceTrue)第三部分用代码“造”数据NumPy 随机生成有时候为了测试代码我们需要大量数据。我们可以用代码模拟生成1. 模拟需求时间2023年1月1日 到 2025年12月20日。水果随机选[苹果,香蕉,车厘子,西瓜,榴莲]。用户随机选[Jack,Tom,Lucy...]。数量随机生成 50-100 之间的数字。2. 核心代码# 1. 生成日期序列 time_range pd.date_range(start1/1/2023, end20/12/2025) # 2. 定义选项池 fruits [苹果,香蕉,车厘子,西瓜,榴莲] names [Jack,Tom,Lucy,Lily,Bob,Mike] # 3. 随机抽选 (关键函数np.random.choice) fruits_list np.random.choice(fruits, sizelen(time_range), replaceTrue) names_list np.random.choice(names, sizelen(time_range), replaceTrue) # 4. 组合成表格 order pd.DataFrame({ 时间: time_range, 水果种类: fruits_list, 用户: names_list, 购买数量: np.random.choice(list(range(50,100)), sizelen(time_range), replaceTrue) })3. 数据可视化热力图用颜色深浅来表示数值大小一眼看出谁是“大胃王”。# cmapSpectral_r 是配色方案颜色越深代表数值越大 order.style.background_gradient(cmapSpectral_r)总结今天我们学到了清洗脏数据处理乱码统一大小写、处理空值平均值填充 vs 向前填充、删除异常值。数据生成利用numpy.random.choice快速构建测试数据集。分析groupby分组求和pivot_table重塑数据。