查看全课大纲(第 51 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 51.空气质量数据怎么“洗”干净,还能画成图?

空气质量数据怎么“洗”干净,还能画成图?

约 12 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

欢迎来到空气质量分析项目的最后一站!经过前面几节的学习,我们已经能爬取数据、处理格式、进行基本统计。这节课,我们要做两件很酷的事:把数据里“不干净”的部分清理掉,然后把我们分析的结果用漂亮的柱状图画出来。学完这一节,你的程序就能从一个“数据处理工”升级为“数据分析师”了!

💡 核心导读

  • 数据清洗:学会用一行代码过滤掉无效数据(比如AQI为0的城市),让分析结果更准确。
  • 数据可视化:用Pandas内置的绘图功能,把空气质量最好的50个城市画成柱状图,一目了然。
  • 中文显示:解决Matplotlib图表中中文变成“小方块”的老问题。
  • 项目收官:回顾整个空气质量分析项目,看看我们从零开始都搭建了哪些能力。

数据也需要“洗澡”:过滤无效值

还记得我们之前统计时,发现有些城市的AQI值是0吗?这通常是因为没有监测点,数据无效。如果把这些数据也拿去算平均值、找最差城市,结果就不准了。所以,数据分析的第一步往往是数据清洗。

本节新增了什么? 我们只做一件事:用“过滤条件”来清洗数据。这个操作简单又强大,是处理数据的必备技能。

怎么过滤呢?Pandas给了我们一个非常直观的语法:数据框[过滤条件]。这个过滤条件,其实就是一列布尔值(True/False),告诉Pandas每一行要不要保留。

我们来实际操作一下。假设我们有一个很小的数据集:

import pandas as pd

# 构造一个包含"脏数据"的小样本
data = {
    'City': ['北京', '上海', '广州', '未知城市A', '未知城市B'],
    'AQI': [120, 95, 80, 0, 0]  # 最后两个城市AQI为0,是无效数据
}
aqi_data = pd.DataFrame(data)
print("清洗前的数据:")
print(aqi_data)
print("\nAQI列大于0的条件:")
print(aqi_data['AQI'] > 0)
清洗前的数据:
     City  AQI
0     北京  120
1     上海   95
2     广州   80
3  未知城市A    0
4  未知城市B    0

AQI列大于0的条件:
0     True
1     True
2     True
3    False
4    False
Name: AQI, dtype: bool

看,aqi_data['AQI'] > 0 生成了一个布尔序列,True表示该行AQI>0,False表示AQI<=0。接下来,神奇的事情发生了:

import pandas as pd

# 再次构造数据(每个代码块独立)
data = {
    'City': ['北京', '上海', '广州', '未知城市A', '未知城市B'],
    'AQI': [120, 95, 80, 0, 0]
}
aqi_data = pd.DataFrame(data)

# 核心操作:用布尔序列作为索引,过滤数据
clean_aqi_data = aqi_data[aqi_data['AQI'] > 0]
print("清洗后的数据(只保留AQI>0的行):")
print(clean_aqi_data)
清洗后的数据(只保留AQI>0的行):
  City  AQI
0   北京  120
1   上海   95
2   广州   80

看!那两个AQI为0的城市自动消失了。这就是数据过滤,是不是比想象中简单?你可以把 aqi_data['AQI'] > 0 这个条件换成任何你想要的,比如 aqi_data['PM2.5'] < 35(PM2.5优),或者组合条件 (aqi_data['AQI'] > 0) & (aqi_data['AQI'] < 50)(空气质量优)。

让数据“开口说话”:用图表做可视化

数字列表看久了会眼花,一张图却能瞬间讲清故事。Pandas内置了绘图功能,基于强大的Matplotlib,但用法简单得多。我们试着把空气质量最好的50个城市画出来。

本节新增了什么? 我们引入Pandas的 .plot() 方法,并学会设置中文显示,让图表既专业又好看。

首先,我们得有一份排序后的干净数据。接着,调用 .plot() 方法,告诉它:画柱状图(kind='bar'),横坐标是城市名(x='City'),纵坐标是AQI值(y='AQI'),再给图表起个名字,调个大小。

import pandas as pd
import matplotlib.pyplot as plt # 导入matplotlib用于保存和显示图片

# 1. 设置全局字体,解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

# 2. 构造一份稍大的、已排序的模拟数据(代表清洗排序后的数据)
cities = [f'城市{i}' for i in range(1, 61)] # 生成60个城市名
aqi_values = list(range(10, 310, 5)) # 生成从10到305的AQI值,模拟排序后从好到差
sorted_data = {
    'City': cities,
    'AQI': aqi_values
}
sorted_aqi_data = pd.DataFrame(sorted_data)

# 3. 取出AQI最小的50个城市(即空气质量最好的50个)
top50_cities = sorted_aqi_data.head(50)
print("空气质量最好的5个城市:")
print(top50_cities.head())

# 4. 绘制柱状图
top50_cities.plot(kind='bar',          # 图表类型:柱状图
                  x='City',            # 横坐标数据列
                  y='AQI',             # 纵坐标数据列
                  title='空气质量最好的50个城市', # 图表标题
                  figsize=(20, 6))     # 图表尺寸:宽20英寸,高6英寸

# 5. 保存图表到文件(在实际练习中,你可以取消下面这行的注释来保存)
# plt.savefig('top50_aqi_bar.png')

# 6. 显示图表
plt.show()
空气质量最好的5个城市:
  City  AQI
0  城市1   10
1  城市2   15
2  城市3   20
3  城市4   25
4  城市5   30

运行上面的代码,一个带有清晰标题和坐标轴的柱状图就会弹出来!你可以直观地看到哪个城市的柱子最短(AQI最小,空气质量最好)。

几个关键点:

  1. plt.rcParams:这两行是解决中文显示问题的“万能钥匙”,几乎任何时候用Matplotlib画带中文的图都需要它们。
  2. .plot()参数:kind 可以换成 'line'(折线图)、'scatter'(散点图)等。figsize 控制图片大小,如果城市名太多显示不全,可以把宽度调大。
  3. 保存与显示:plt.savefig() 要在 plt.show() 之前调用,否则保存的是空白图片。plt.show() 会弹出窗口并暂停程序,关闭窗口后程序才会继续。

项目大回顾:从零搭建数据分析流水线

到这里,我们为期六讲的“空气质量指数计算”大项目就全部完成了!让我们一起回顾一下这条我们亲手搭建的“数据流水线”:

  1. v1.0 - v4.0:打好基础

    • 理解问题:学会AQI的计算公式。
    • 处理数据:认识了JSON和CSV两种常见数据格式,学会了读写和转换。
    • 完善程序:让程序能智能判断文件类型,用更安全的方式操作文件。
  2. v5.0 - v8.0:获取数据

    • 网络爬虫:使用Requests库从网上抓取实时数据。
    • 解析网页:用BeautifulSoup从复杂的HTML中精准提取我们需要的信息(城市列表和AQI值)。
    • 保存结果:将爬取到的全国城市数据保存为结构化的CSV文件,方便后续分析。
  3. v9.0 - v10.0(本节):分析与展示

    • 数据分析:使用Pandas进行排序、统计(最大值、最小值、平均值)。
    • 数据清洗:过滤掉无效数据,保证分析质量。
    • 数据可视化:将分析结果用图表直观呈现。

这个过程,就是一个标准的、简易版的数据分析项目流程:定义问题 → 获取数据 → 清洗处理 → 分析建模 → 可视化展示。你已经掌握了每个环节的核心技能!

📝 动手练一练

  1. 改造可视化:上面的例子画了最好的50个城市。请你修改代码,画出空气质量最差的10个城市的柱状图,并将图表标题和保存的文件名相应修改。
👉 点击查看参考答案

思路:空气质量最差意味着AQI值最大。我们可以对数据按AQI降序排序,然后取前10名。

import pandas as pd
import matplotlib.pyplot as plt

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

# 构造数据
cities = [f'城市{i}' for i in range(1, 61)]
aqi_values = list(range(10, 310, 5))
aqi_data = pd.DataFrame({'City': cities, 'AQI': aqi_values})

# 按AQI降序排序,取前10个
bottom10_cities = aqi_data.sort_values(by='AQI', ascending=False).head(10)

# 绘图
bottom10_cities.plot(kind='bar',
                     x='City',
                     y='AQI',
                     title='空气质量最差的10个城市',
                     figsize=(12, 6))
# plt.savefig('bottom10_aqi_bar.png') # 可取消注释保存
plt.show()
  1. 尝试新图表:Pandas的 .plot() 方法中,kind 参数还可以设置成 'line'(折线图)或 'pie'(饼图,需指定 y)。请你尝试将“最好50城”的数据用折线图画出来,看看效果有什么不同。
👉 点击查看参考答案

思路:只需将 .plot() 中的 kind='bar' 改为 kind='line'。折线图更适合观察趋势。

import pandas as pd
import matplotlib.pyplot as plt

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

cities = [f'城市{i}' for i in range(1, 51)]
aqi_values = list(range(10, 260, 5)) # 生成50个值
top50_cities = pd.DataFrame({'City': cities, 'AQI': aqi_values})

# 绘制折线图
top50_cities.plot(kind='line',
                  x='City',
                  y='AQI',
                  title='空气质量最好的50个城市(折线图)',
                  figsize=(20, 6),
                  marker='o') # marker='o' 让每个数据点显示为圆点
plt.xticks(rotation=45) # 将x轴标签旋转45度,避免重叠
plt.tight_layout() # 自动调整布局
# plt.savefig('top50_aqi_line.png')
plt.show()

本章小结

恭喜你!完成了《Python入门》课程中最后一个,也是最综合的一个项目。你不仅学会了爬虫、数据处理、分析可视化这些具体技能,更重要的是,你体验了如何将一个现实问题,拆解成多个编程步骤,并最终用代码实现的完整过程。

📋 行动清单

学完本章,你可以立刻:

  • 运行本节完整的10.0代码(使用课程提供的真实china_city_aqi.csv数据文件),生成属于你的“空气质量50强”图表。
  • 总结你的项目笔记,画出从5.0到10.0的数据流图,理清思路。
  • 挑战自己,尝试用这个流程去分析另一个你感兴趣的数据集(例如,电影评分、天气数据等)。

从对编程一无所知,到能完成这样一个涵盖数据获取、处理、分析、可视化的项目,你已经迈出了坚实而精彩的第一步。编程世界的大门已经向你敞开,接下来,选择你感兴趣的方向,继续探索吧!

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第9章代码包:空气质量指数计算(含全部版本 10 个 .py)
    ZIP · 64KB
    下载
  • 数据集:aqi.csv(各城市 AQI 长表)
    772B
    下载
  • 数据集:beijing_aqi.json(北京监测点)
    3KB
    下载
  • 数据集:bottom10_aqi.csv(空气质量最差 10 城)
    412B
    下载
  • 数据集:china_city_aqi.csv(全国城市 AQI)
    13KB
    下载
  • 数据集:shanghai_aqi.json(上海监测点)
    3KB
    下载
  • 数据集:top10_aqi.csv(空气质量最好 10 城)
    372B
    下载
  • 数据集:top5_aqi.json(空气质量最好 5 城)
    1007B
    下载
看图文没弄懂?展开看本节视频讲解(约 12 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)