查看全课大纲(第 50 / 51 节)
- 1.为什么人人都该学点编程?
- 2.计算机与程序设计:你的电脑到底在“想”什么?
- 3.Python 这门语言,到底有什么魔力?
- 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
- 5.如何安装一个更强大的代码编辑器?
- 6.汇率兑换1.0:你的第一个“钱生钱”小程序
- 7.你的第一行代码,藏着哪些秘密?
- 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
- 9.汇率兑换程序,如何让它“聪明”地判断币种?
- 10.汇率兑换程序能一直运行,直到我喊停吗?
- 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
- 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
- 13.怎么用 Python 画一个会动的五角星?
- 14.如何让程序自动画出不同大小的五角星?
- 15.函数自己调用自己,会发生什么?
- 16.用递归画出神奇的分形树
- 17.Python 怎么计算你一天躺着不动能消耗多少热量?
- 18.如何让程序“活”起来,持续为你服务?
- 19.如何让 BMR 计算器更“聪明”?
- 20.当程序遇到“不按套路出牌”的用户怎么办?
- 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
- 22.如何用列表记录每一周的存款?
- 23.如何让程序自己数数?—— 用 for 循环解放你的双手
- 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
- 25.52周存钱挑战:怎么根据日期自动查存款?
- 26.Python 怎么判断一年中的第几天?
- 27.列表 vs 元组:哪个更适合存储月份天数?
- 28.用集合给月份分个队,换个思路算天数
- 29.把月份和天数“锁”在一起:用字典给数据配个对
- 30.Python 怎么判断密码强弱?
- 31.Python 怎么给密码设置“防沉迷”系统?
- 32.Python 怎么把密码保存到文件里?
- 33.Python 怎么读取文件里的密码?
- 34.Python 怎么把密码检查工具“打包”起来?
- 35.Python 怎么把文件操作也“打包”起来?
- 36.计算机怎么“扔骰子”?——用Python模拟随机事件
- 37.如何用 Python 模拟掷两个骰子?
- 38.怎么用 Python 把骰子轨迹画出来?
- 39.骰子点数分布长啥样?用直方图一眼看穿!
- 40.用科学计算库让骰子程序“起飞”
- 41.空气质量指数怎么算?手把手教你写一个AQI计算器
- 42.空气质量指数计算:从零开始,让程序看懂空气
- 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
- 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
- 45.Python 怎么让程序自己判断文件类型?
- 46.如何让程序自己上网查空气质量?
- 47.用美味的汤来解析网页:Beautiful Soup 入门
- 48.如何让爬虫自动抓取全国所有城市的空气质量?
- 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
- 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
- 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: int642. 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 成都 110info() 方法非常有用,它告诉我们:
- 一共有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 西安 115sort_values(by=['AQI']) 实现了按 AQI 列的值进行排序,默认是升序(从小到大)。.head(10) 则取出了排序后的前10行。
找出空气质量最差的10个城市 有两种思路:
- 升序排列后,取末尾10个(
.tail(10))。 - 直接降序排列(从大到小),然后取前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'),就能分析全国几百个城市的真实数据了!
📝 动手练一练
修改统计项:除了最大值、最小值、平均值,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())**输出示例**:
```textAQI中位数: 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 内置的功能做出漂亮的**数据可视化图表**,让我们的分析结果一目了然!
—— 小象教研组配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。