行者孙Python

摆盘篇-Day30|收官满汉全席:完整项目,读入 → 清洗 → 分析 → 可视化一条龙

📖 知识点回顾(四大篇章全回顾)

  • 进货篇:pd.read_csv() / DataFrame() 读入数据,head/info/describe 概览

  • 择洗篇:drop_duplicates 去重、isnull/fillna 处理缺失、astype 转类型、rename 改列名

  • 烹制篇:groupby 分组、agg 聚合、pivot_table 透视、value_counts 频次、sort_values 排序、corr 相关

  • 摆盘篇:plot 画柱状图 / 折线图 / 饼图 / 直方图,plt.show() 展示

💡 收官流程(完整项目套路)读入数据 → 概览鉴货 → 清洗去重补缺规范 → 分组聚合分析 → 排序找极值 → 画图可视化 → 输出结论

⚔️ Kata 实战任务(收官项目)

任务需求:

  1. 导入 pandas 和 matplotlib

  2. 创建一份 "多菜系多时段销售" 数据(含脏数据:重复、缺失、文本数字)

  3. 概览:用 head /info/isnull 看数据

  4. 清洗:去重、填充缺失、类型转换、改列名

  5. 分析:groupby 分组聚合算各菜系销量,sort 找销量最高,value_counts 看时段分布

  6. 可视化:画 "各菜系销量柱状图" 和 "各时段销量占比饼图"

  7. 输出完整分析结论

参考代码

 

import matplotlib.pyplot as plt
import pandas as pd

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# ===== 1. 读入数据(含脏数据)=====
data = {
    "菜系": ["川菜", "鲁菜", "川菜", "粤菜", "鲁菜", "粤菜", "川菜", "川菜"],
    "时段": ["午餐", "晚餐", "午餐", "午餐", "晚餐", "午餐", "晚餐", "午餐"],
    "菜名": ["麻婆豆腐", "葱爆羊肉", "回锅肉", "白切鸡", "糖醋鱼", "叉烧", "水煮鱼", "鱼香肉丝"],
    "销量": ["60", "40", "80", None, "55", "20", "50", "70"],   # 有缺失、文本数字
    "价格": [20, 35, 25, 30, 40, 26, 28, 18],
}
df = pd.DataFrame(data)
print("===== 1. 原始数据概览 =====")
print(df)
print("\n缺失情况:\n", df.isnull().sum())

# ===== 2. 清洗 =====
# 去重(本数据无重复,保留原样)、补缺、转类型、改列名
df["销量"] = df["销量"].astype(float)                      # 文本数字转float
df["销量"] = df["销量"].fillna(df["销量"].mean())          # 缺失用均值填充
df["销量"] = df["销量"].astype(int)                        # 转整数
df = df.rename(columns={"菜名": "菜品"})                   # 改列名
print("\n===== 2. 清洗后 =====")
print(df)

# ===== 3. 分析 =====
print("\n===== 3a. 各菜系销量总和 =====")
by_cuisine = df.groupby("菜系")["销量"].sum()
print(by_cuisine)

print("\n===== 3b. 销量最高的菜系 =====")
best = by_cuisine.sort_values(ascending=False).index[0]
print(f"🥇 销量最高菜系:{best}({by_cuisine.max()})")

print("\n===== 3c. 各时段销售占比 =====")
print(df["时段"].value_counts(normalize=True).round(3))

# ===== 4. 可视化 =====
print("\n===== 4a. 各菜系销量柱状图 =====")
by_cuisine.plot(kind="bar", title="各菜系销量对比", color="skyblue")
plt.show()

print("===== 4b. 各时段销量饼图 =====")
df.groupby("时段")["销量"].sum().plot(
    kind="pie", autopct="%.1f%%", title="各时段销量占比", figsize=(6, 6))
plt.show()

# ===== 5. 输出结论 =====
print("\n===== 📝 收官分析结论 =====")
print(f"1. 销量最高的菜系是「{best}」,总销量 {by_cuisine.max()}")
print("2. 清洗后数据已规范:无缺失、销量为整数、列名统一")
print("3. 结合柱状图与饼图,可直观看到各菜系、各时段的销售格局")

 

运行输出(先打印分析结果,再弹两张图,最后结论):

 

===== 1. 原始数据概览 =====
   菜系  时段     菜名  销量  价格
0  川菜  午餐  麻婆豆腐   60   20
1  鲁菜  晚餐  葱爆羊肉   40   35
2  川菜  午餐    回锅肉   80   25
3  粤菜  午餐    白切鸡  NaN   30
4  鲁菜  晚餐    糖醋鱼   55   40
5  粤菜  午餐     叉烧   20   26
6  川菜  晚餐    水煮鱼   50   28
7  川菜  午餐   鱼香肉丝   70   18

缺失情况:
菜系    0
时段    0
菜品    0
销量    1
价格    0
dtype: int64

===== 2. 清洗后 =====
   菜系  时段     菜品  销量  价格
0  川菜  午餐  麻婆豆腐   60   20
1  鲁菜  晚餐  葱爆羊肉   40   35
2  川菜  午餐    回锅肉   80   25
3  粤菜  午餐    白切鸡   53   30
4  鲁菜  晚餐    糖醋鱼   55   40
5  粤菜  午餐     叉烧   20   26
6  川菜  晚餐    水煮鱼   50   28
7  川菜  午餐   鱼香肉丝   70   18

===== 3a. 各菜系销量总和 =====
菜系
川菜    260
鲁菜     95
粤菜     73
Name: 销量, dtype: int64

===== 3b. 销量最高的菜系 =====
🥇 销量最高菜系:川菜(260)

===== 3c. 各时段销售占比 =====
午餐    0.75
晚餐    0.25
Name: 时段, dtype: float64

===== 4a. 各菜系销量柱状图 =====
(弹出柱状图)
===== 4b. 各时段销量饼图 =====
(弹出饼图)

===== 📝 收官分析结论 =====
1. 销量最高的菜系是「川菜」,总销量 260
2. 清洗后数据已规范:无缺失、销量为整数、列名统一
3. 结合柱状图与饼图,可直观看到各菜系、各时段的销售格局

 

🧠 思考题

  1. 这个完整项目分成了 "读入→清洗→分析→可视化" 四步,你觉得每一步各自解决了什么核心问题?

  2. 如果这份数据是从 CSV 文件读入的,第 1 步该怎么改?清洗后想存回文件用哪个方法(提示:to_csv)?

你已经是一位能 "端出完整数据菜" 的数据分析师。如需继续,你可以开启进阶篇章:时间序列分析、Excel 高级读写、与爬虫 / 数据库对接分析等。祝分析愉快,下次开课再会!

‹ 返回目录
🏠首页 Python 📦资源 👤关于我