查看全课大纲(第 50 / 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.空气质量数据怎么“洗”干净,还能画成图?

用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市

约 21 分钟

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

在上一节,我们成功从网站上抓取了全国城市的空气质量数据,并保存成了 CSV 文件。现在,我们手里有了一个“数据宝库”,但光有数据可不够酷——我们要像真正的数据分析师一样,从数据里挖出有意思的结论!这一节,我们就用 Python 里一个超级强大的工具 pandas,来快速找出全国空气质量最好和最差的十个城市,并生成排行榜。学完这一节,你就能轻松处理和分析任何表格数据了。

💡 核心导读

  • 认识 pandas:一个专门处理表格数据的“瑞士军刀”,比我们之前用 CSV 模块手动读写方便太多了。
  • 读取数据:用 pd.read_csv() 一行代码就能把 CSV 文件变成 Python 里好用的数据结构。
  • 探索数据:快速查看数据长什么样、有多少行、有没有空值。
  • 基本统计:计算最大值、最小值、平均值,对数据有个整体把握。
  • 排序与筛选:按空气质量指数(AQI)排序,轻松找出“优等生”和“差等生”。
  • 保存结果:把分析好的排行榜再保存成新的 CSV 文件,方便分享。

认识数据分析利器:pandas

在开始之前,我们先来认识一下今天的主角:pandas。它不是那只可爱的熊猫,而是一个 Python 库的名字。你可以把它想象成一个专门为处理表格数据(比如 Excel 表格、CSV 文件)而生的“超级工具箱”。

结构化数据 vs 非结构化数据

  • 结构化数据:就像我们的 CSV 文件,数据整齐地排列在行和列里,有明确的“表头”。这种数据是 pandas 最擅长的。
  • 非结构化数据:比如一张图片、一段音频、一个视频。它们没有固定的行列结构,pandas 处理起来就不那么方便了。

pandas 建立在另一个我们之前提过的库 NumPy 之上,性能很强。它被广泛用于数据挖掘、数据分析(比如分析学生成绩、股票走势),甚至还提供了“数据清洗”功能——帮我们把脏数据(比如空值、错误值)清理干净。

本节新增了什么?

本节我们只做一件事:引入 pandas 库,用它来读取、分析和保存我们的空气质量数据。 你会发现,用上专业的工具,之前需要写很多行代码才能完成的事情,现在一两行就搞定了!

pandas 的核心数据结构:Series 和 DataFrame

pandas 主要用两种结构来装数据,理解它们对后续操作至关重要。

1. Series:一维数据表 你可以把它看作一个带标签的列表(或一列数据)。左边是自动生成的索引(从0开始),右边是实际的数据值。

我们来创建一个 Series 看看:

import pandas as pd

# 创建一个 Series,数据是 10 到 19
series_data = pd.Series(range(10, 20))
print("创建的 Series:")
print(series_data)
print("\n它的类型是:", type(series_data))
创建的 Series:
0    10
1    11
2    12
3    13
4    14
5    15
6    16
7    17
8    18
9    19
dtype: int64

它的类型是: <class 'pandas.Series'>

看,左边是索引(0-9),右边是值(10-19)。我们可以方便地获取索引或值,也可以预览头部或尾部的几行数据。

import pandas as pd

series_data = pd.Series(range(10, 20))

print("索引:", series_data.index)
print("值:", series_data.values)
print("前3行:")
print(series_data.head(3))
print("后3行:")
print(series_data.tail(3))
索引: RangeIndex(start=0, stop=10, step=1)
值: [10 11 12 13 14 15 16 17 18 19]
前3行:
0    10
1    11
2    12
dtype: int64
后3行:
7    17
8    18
9    19
dtype: int64

2. DataFrame:二维数据表(更常用!) 这就是我们熟悉的表格了!它既有行索引,也有列索引(列名)。我们直接从 CSV 文件读取进来的数据,默认就是 DataFrame 类型,用起来特别顺手。

实战:用 pandas 分析全国城市 AQI

理论说再多不如动手一试。现在,我们就用 pandas 来处理我们抓取到的 china_city_aqi.csv 文件。

注意:为了让代码能在任何环境下直接运行,我们不会直接读取外部文件,而是在代码里构造一个小的样本数据集来演示。完整的全国城市 AQI 数据集,你可以在本课程的 resources 附件中找到并下载练习。

第一步:读取与探索数据

在真实项目中,我们拿到数据后的第一步永远是“先看看它长什么样”。

import pandas as pd

# 构造一个小的样本数据集来演示(真实数据见课程resources)
sample_data = {
    'City': ['北京', '上海', '广州', '深圳', '成都', '杭州', '武汉', '西安', '沈阳', '三亚', '大兴安岭', '邯郸'],
    'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]
}
aqi_data = pd.DataFrame(sample_data)

print("=== 数据基本信息 ===")
print(aqi_data.info())
print("\n=== 预览前5行数据 ===")
print(aqi_data.head())
=== 数据基本信息 ===
<class 'pandas.DataFrame'>
RangeIndex: 12 entries, 0 to 11
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   City    12 non-null     str
 1   AQI     12 non-null     int64
dtypes: int64(1), str(1)
memory usage: 324.0 bytes
None

=== 预览前5行数据 ===
  City  AQI
0   北京  120
1   上海   95
2   广州   80
3   深圳   75
4   成都  110

info() 方法非常有用,它告诉我们:

  • 一共有12行数据,2列。
  • 列名是 City 和 AQI。
  • City 列是字符串类型(pandas 3.x 显示为 str;旧版 pandas 这里显示的是 object),AQI 列是整数类型。
  • 没有空值(Non-Null Count 等于总行数)。
  • 占用了 324 字节内存。

head() 方法则让我们直观地看到数据的前几行。

第二步:基本统计

对数据有个整体印象后,我们来做些简单的统计。

import pandas as pd

sample_data = {
    'City': ['北京', '上海', '广州', '深圳', '成都', '杭州', '武汉', '西安', '沈阳', '三亚', '大兴安岭', '邯郸'],
    'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]
}
aqi_data = pd.DataFrame(sample_data)

print("=== AQI 基本统计 ===")
print("AQI 最大值:", aqi_data['AQI'].max())
print("AQI 最小值:", aqi_data['AQI'].min())
print("AQI 平均值:", aqi_data['AQI'].mean())
=== AQI 基本统计 ===
AQI 最大值: 157
AQI 最小值: 0
AQI 平均值: 88.25

看,统计起来就是这么简单!aqi_data['AQI'] 选中了名为“AQI”的那一列(这是一个 Series),然后直接调用 .max(), .min(), .mean() 方法就得到了结果。

咦,最小值是 0? 在空气质量指数中,AQI 为 0 通常意味着该地点没有监测站或数据缺失,并不是真的空气质量“无限好”。在正式分析中,我们需要清洗掉这些无效数据。这个我们留到下一节细说。

第三步:排序与找出 Top 10

最激动人心的部分来了!我们要找出空气质量最好和最差的10个城市。

找出空气质量最好的10个城市(AQI 从小到大排)

import pandas as pd

sample_data = {
    'City': ['北京', '上海', '广州', '深圳', '成都', '杭州', '武汉', '西安', '沈阳', '三亚', '大兴安岭', '邯郸'],
    'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]
}
aqi_data = pd.DataFrame(sample_data)

# 按 AQI 升序排序,并取前10名
top10_cities = aqi_data.sort_values(by=['AQI']).head(10)
print("=== 空气质量最好的10个城市 ===")
print(top10_cities)
=== 空气质量最好的10个城市 ===
    City  AQI
10  大兴安岭    0
9     三亚   42
5     杭州   65
3     深圳   75
2     广州   80
1     上海   95
8     沈阳   98
6     武汉  102
4     成都  110
7     西安  115

sort_values(by=['AQI']) 实现了按 AQI 列的值进行排序,默认是升序(从小到大)。.head(10) 则取出了排序后的前10行。

找出空气质量最差的10个城市 有两种思路:

  1. 升序排列后,取末尾10个(.tail(10))。
  2. 直接降序排列(从大到小),然后取前10个。

我们来演示第二种更直观的方法:

import pandas as pd

sample_data = {
    'City': ['北京', '上海', '广州', '深圳', '成都', '杭州', '武汉', '西安', '沈阳', '三亚', '大兴安岭', '邯郸'],
    'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]
}
aqi_data = pd.DataFrame(sample_data)

# 按 AQI 降序排序,并取前10名
bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=False).head(10)
print("=== 空气质量最差的10个城市 ===")
print(bottom10_cities)
=== 空气质量最差的10个城市 ===
   City  AQI
11   邯郸  157
0    北京  120
7    西安  115
4    成都  110
6    武汉  102
8    沈阳   98
1    上海   95
2    广州   80
3    深圳   75
5    杭州   65

这里的关键参数是 ascending=False,它告诉 pandas 要按降序排列。

第四步:保存分析结果

分析出了排行榜,我们当然要把它保存下来。用 pandas 保存为 CSV 文件,也是一行代码的事!

import pandas as pd

sample_data = {
    'City': ['北京', '上海', '广州', '深圳', '成都', '杭州', '武汉', '西安', '沈阳', '三亚', '大兴安岭', '邯郸'],
    'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]
}
aqi_data = pd.DataFrame(sample_data)

top10_cities = aqi_data.sort_values(by=['AQI']).head(10)
bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=False).head(10)

# 保存到CSV文件(此处注释掉,实际运行时可以取消注释)
# top10_cities.to_csv('top10_aqi.csv', index=False)
# bottom10_cities.to_csv('bottom10_aqi.csv', index=False)

print("【提示】上面两行代码可以将结果保存为 CSV 文件。")
print("to_csv('top10_aqi.csv', index=False) 中,index=False 表示不保存最左边的行索引列。")
【提示】上面两行代码可以将结果保存为 CSV 文件。
to_csv('top10_aqi.csv', index=False) 中,index=False 表示不保存最左边的行索引列。

to_csv() 方法将 DataFrame 保存为 CSV 文件。参数 index=False 非常重要,它避免了将 DataFrame 中自动生成的行索引(0,1,2…)也写入文件,让生成的文件更简洁。

把所有步骤整合起来

让我们把上面的所有操作,整合成一个完整的、可以直接运行的程序。

"""
    作者:小象教研组
    功能:用pandas分析城市AQI数据,找出最好和最差的10个城市
    版本:9.0
"""
import pandas as pd

def main():
    # 1. 构造样本数据(真实数据请使用 pd.read_csv('你的文件.csv'))
    sample_data = {
        'City': ['北京', '上海', '广州', '深圳', '成都', '杭州', '武汉', '西安', '沈阳', '三亚', '大兴安岭', '邯郸'],
        'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]
    }
    aqi_data = pd.DataFrame(sample_data)

    print('=== 数据基本信息 ===')
    print(aqi_data.info())

    print('\n=== 数据预览(前5行)===')
    print(aqi_data.head())

    # 2. 基本统计
    print('\n=== AQI 基本统计 ===')
    print('AQI最大值:', aqi_data['AQI'].max())
    print('AQI最小值:', aqi_data['AQI'].min())
    print('AQI均值:', aqi_data['AQI'].mean())

    # 3. Top 10 (最好)
    top10_cities = aqi_data.sort_values(by=['AQI']).head(10)
    print('\n=== 空气质量最好的10个城市 ===')
    print(top10_cities)

    # 4. Bottom 10 (最差)
    bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=False).head(10)
    print('\n=== 空气质量最差的10个城市 ===')
    print(bottom10_cities)

    # 5. 保存结果(此处注释,实际使用可取消注释)
    # top10_cities.to_csv('top10_aqi.csv', index=False)
    # bottom10_cities.to_csv('bottom10_aqi.csv', index=False)
    # print('\n结果已保存为 top10_aqi.csv 和 bottom10_aqi.csv')

# 运行主函数
main()
=== 数据基本信息 ===
<class 'pandas.DataFrame'>
RangeIndex: 12 entries, 0 to 11
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   City    12 non-null     str  
 1   AQI     12 non-null     int64
dtypes: int64(1), str(1)
memory usage: 324.0 bytes
None

=== 数据预览(前5行)===
  City  AQI
0   北京  120
1   上海   95
2   广州   80
3   深圳   75
4   成都  110

=== AQI 基本统计 ===
AQI最大值: 157
AQI最小值: 0
AQI均值: 88.25

=== 空气质量最好的10个城市 ===
    City  AQI
10  大兴安岭    0
9     三亚   42
5     杭州   65
3     深圳   75
2     广州   80
1     上海   95
8     沈阳   98
6     武汉  102
4     成都  110
7     西安  115

=== 空气质量最差的10个城市 ===
   City  AQI
11   邯郸  157
0    北京  120
7    西安  115
4    成都  110
6    武汉  102
8    沈阳   98
1    上海   95
2    广州   80
3    深圳   75
5    杭州   65

运行这个程序,你就能看到从数据探索、统计到排序输出的完整流程。如果你下载了课程提供的完整 china_city_aqi.csv 文件,只需要将构造 sample_data 的那部分代码,替换成 aqi_data = pd.read_csv('china_city_aqi.csv'),就能分析全国几百个城市的真实数据了!

📝 动手练一练

  1. 修改统计项:除了最大值、最小值、平均值,pandas 的 Series 还有 .median()(中位数)、.std()(标准差)等方法。尝试修改代码,计算并输出 AQI 数据的中位数和标准差,看看能发现什么?

    👉 点击查看参考答案

    思路:中位数是将数据排序后位于中间的值,能避免极端值影响。标准差反映数据的波动程度。

import pandas as pd
sample_data = {'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]}
aqi_series = pd.Series(sample_data['AQI'])

print("AQI中位数:", aqi_series.median())
print("AQI标准差:", aqi_series.std())
**输出示例**:
```text

AQI中位数: 96.5 AQI标准差: 40.411800706769256

    中位数(96.5)比平均值(88.25)高,说明数据分布可能向左偏移(有较多低值)。标准差较大,说明各城市AQI差异很大。
    </details>

2.  **筛选数据**:我们注意到数据中有 AQI 为 0 的无效记录。请尝试在排序之前,先筛选掉 `aqi_data` 中 `AQI` 等于 0 的行,然后再进行 Top 10 和 Bottom 10 的排名。提示:可以使用 `aqi_data[aqi_data['AQI'] > 0]` 进行筛选。
    <details>
    <summary>👉 点击查看参考答案</summary>

    **思路**:通过布尔条件 `aqi_data['AQI'] > 0` 生成一个 True/False 序列,再用它来索引原 DataFrame,就能得到筛选后的数据。
```python
import pandas as pd
sample_data = {
    'City': ['北京', '上海', '广州', '深圳', '成都', '杭州', '武汉', '西安', '沈阳', '三亚', '大兴安岭', '邯郸'],
    'AQI': [120, 95, 80, 75, 110, 65, 102, 115, 98, 42, 0, 157]
}
aqi_data = pd.DataFrame(sample_data)

# 筛选掉 AQI 为 0 的数据
clean_data = aqi_data[aqi_data['AQI'] > 0]
print("清洗后数据量:", len(clean_data), "条")
print("空气质量最好的城市(清洗后):")
print(clean_data.sort_values(by='AQI').head(3))
**输出示例**:
```text

清洗后数据量: 11 条 空气质量最好的城市(清洗后): City AQI 9 三亚 42 5 杭州 65 3 深圳 75

    可以看到,清洗后“大兴安岭(AQI=0)”被排除,三亚成为了第一名。
    </details>

## 本章小结

恭喜!在这一节,你成功地从一名“数据收集员”升级为了“数据分析师”。通过引入强大的 pandas 库,你学会了:

- **一键读写**:用 `read_csv()` 和 `to_csv()` 轻松处理 CSV 文件,告别繁琐的手动解析。
- **数据探索**:使用 `.info()` 和 `.head()` 快速了解数据的全貌和样貌。
- **描述统计**:用 `.max()`, `.min()`, `.mean()` 等**方法**对数据进行整体描述。
- **排序筛选**:用 `sort_values()` 对数据排序,用简单的条件(如 `AQI > 0`)筛选数据,精准定位目标。
- **完整流程**:体验了从读取、探索、分析到输出结果的数据分析标准流程。

### 📋 行动清单
学完立刻可以做的几件事:
- [ ] **运行完整代码**:把本节最后的整合代码复制到你的编辑器中运行,观察每一步的输出。
- [ ] **替换真实数据**:下载课程 resources 中的 `china_city_aqi.csv`,修改代码读取它,看看全国城市的真实排名是怎样的?
- [ ] **挑战练习**:完成上面的“动手练一练”,尝试计算更多统计量,并清洗掉无效数据,让你的排行榜更准确。

在下一节,我们将继续深入 pandas 的魔法世界,学习如何更专业地进行**数据清洗**(比如处理缺失值、异常值),以及如何用 pandas 内置的功能做出漂亮的**数据可视化图表**,让我们的分析结果一目了然!

—— 小象教研组

配套资料 · 直接下载

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

  • 第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
    下载
看图文没弄懂?展开看本节视频讲解(约 21 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)