📖 知识点回顾(四大篇章全回顾)
进货篇:
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 实战任务(收官项目)
任务需求:
导入 pandas 和 matplotlib
创建一份 "多菜系多时段销售" 数据(含脏数据:重复、缺失、文本数字)
概览:用 head /info/isnull 看数据
清洗:去重、填充缺失、类型转换、改列名
分析:groupby 分组聚合算各菜系销量,sort 找销量最高,value_counts 看时段分布
可视化:画 "各菜系销量柱状图" 和 "各时段销量占比饼图"
输出完整分析结论
参考代码
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. 结合柱状图与饼图,可直观看到各菜系、各时段的销售格局
🧠 思考题
这个完整项目分成了 "读入→清洗→分析→可视化" 四步,你觉得每一步各自解决了什么核心问题?
如果这份数据是从 CSV 文件读入的,第 1 步该怎么改?清洗后想存回文件用哪个方法(提示:
to_csv)?
你已经是一位能 "端出完整数据菜" 的数据分析师。如需继续,你可以开启进阶篇章:时间序列分析、Excel 高级读写、与爬虫 / 数据库对接分析等。祝分析愉快,下次开课再会!