查看全课大纲(第 39 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

索引操作总结

约 6 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在之前的课程中,我们学习了Pandas的多种索引方式。索引是高效访问和操作数据的核心。本节将对核心的索引操作进行系统性总结,并引入一个强大的数据筛选工具——布尔值遮罩,帮助你更灵活、更精确地控制数据。

💡 核心导读

  • 索引类型回顾:掌握 .loc(标签索引)与 .iloc(位置索引)的核心区别与适用场景。
  • 布尔值遮罩:理解如何通过条件判断生成布尔序列,并利用它进行高效的数据过滤。
  • 条件过滤实战:学习将复杂的筛选条件转化为简洁的遮罩操作,实现数据的快速提取。
  • 思维迁移:将NumPy中的“遮罩索引”思想无缝应用到Pandas的DataFrame操作中。

索引操作核心:.loc 与 .iloc

Pandas的索引操作主要可归纳为两种核心方法,它们都主要用于行索引:

  1. .loc[]:基于标签的索引。传入的是行或列的索引标签(通常是字符串或整数标签)。
  2. .iloc[]:基于整数位置的索引。传入的是行或列从0开始的整数位置。

一个重要的细节是:使用 .loc 进行切片时,其结果是包含末尾位置的,这与Python原生的列表切片(不包含末尾)不同,但与Pandas标签索引的语义一致。

让我们通过代码来巩固印象。首先,我们构建一个示例DataFrame。

import pandas as pd

# 构建示例DataFrame
country1 = pd.Series({'Name': '中国', 'Language': 'Chinese', 'Area': '9.597M km2', 'Happiness Rank': 79})
country2 = pd.Series({'Name': '美国', 'Language': 'English (US)', 'Area': '9.834M km2', 'Happiness Rank': 14})
country3 = pd.Series({'Name': '澳大利亚', 'Language': 'English (AU)', 'Area': '7.692M km2', 'Happiness Rank': 9})

df = pd.DataFrame([country1, country2, country3], index=['CH', 'US', 'AU'])
print("原始DataFrame:")
print(df)
原始DataFrame:
    Name      Language        Area  Happiness Rank
CH    中国       Chinese  9.597M km2              79
US    美国  English (US)  9.834M km2              14
AU  澳大利亚  English (AU)  7.692M km2               9

现在,我们分别使用 .loc 和 .iloc 进行索引操作。

import pandas as pd

# 重新构建DataFrame,确保代码块自包含
country1 = pd.Series({'Name': '中国', 'Language': 'Chinese', 'Area': '9.597M km2', 'Happiness Rank': 79})
country2 = pd.Series({'Name': '美国', 'Language': 'English (US)', 'Area': '9.834M km2', 'Happiness Rank': 14})
country3 = pd.Series({'Name': '澳大利亚', 'Language': 'English (AU)', 'Area': '7.692M km2', 'Happiness Rank': 9})
df = pd.DataFrame([country1, country2, country3], index=['CH', 'US', 'AU'])

# 1. 使用.loc基于标签索引单行
print("1. 使用 df.loc['CH'] 选择中国数据:")
print(df.loc['CH'])
print("\n" + "-"*30 + "\n")

# 2. 使用.iloc基于位置索引多行(传入位置列表)
print("2. 使用 df.iloc[[0, 2]] 选择第0行和第2行:")
print(df.iloc[[0, 2]])
1. 使用 df.loc['CH'] 选择中国数据:
Name                      中国
Language             Chinese
Area              9.597M km2
Happiness Rank            79
Name: CH, dtype: object

------------------------------

2. 使用 df.iloc[[0, 2]] 选择第0行和第2行:
    Name      Language        Area  Happiness Rank
CH    中国       Chinese  9.597M km2              79
AU  澳大利亚  English (AU)  7.692M km2               9

强大的数据筛选器:布尔值遮罩

除了直接的标签和位置索引,Pandas还支持一种更为灵活和强大的索引方式——布尔值遮罩。其思想源于NumPy:通过一个与原数据尺寸相同的布尔值(True/False)数组(遮罩),来“遮盖”数据,只留下标记为True的部分。

遮罩的生成与应用

生成遮罩的核心是条件判断。例如,我们想找出所有说英语的国家。

import pandas as pd

# 重新构建DataFrame
country1 = pd.Series({'Name': '中国', 'Language': 'Chinese', 'Area': '9.597M km2', 'Happiness Rank': 79})
country2 = pd.Series({'Name': '美国', 'Language': 'English (US)', 'Area': '9.834M km2', 'Happiness Rank': 14})
country3 = pd.Series({'Name': '澳大利亚', 'Language': 'English (AU)', 'Area': '7.692M km2', 'Happiness Rank': 9})
df = pd.DataFrame([country1, country2, country3], index=['CH', 'US', 'AU'])

# 步骤1:生成布尔值遮罩 - 检查'Language'列是否包含'English'
mask = df['Language'].str.contains('English')
print("生成的布尔值遮罩 (mask):")
print(mask)
print("\n" + "-"*30 + "\n")

# 步骤2:应用遮罩过滤数据
english_speaking_countries = df[mask]
print("应用遮罩后,说英语的国家:")
print(english_speaking_countries)
生成的布尔值遮罩 (mask):
CH    False
US     True
AU     True
Name: Language, dtype: bool

------------------------------

应用遮罩后,说英语的国家:
    Name      Language        Area  Happiness Rank
US    美国  English (US)  9.834M km2              14
AU  澳大利亚  English (AU)  7.692M km2               9

过程解析:

  1. df['Language'].str.contains('English') 对Language列的每个元素进行字符串检查,返回一个与原列等长的布尔Series(遮罩)。
  2. 将遮罩mask放入DataFrame的方括号df[mask]中,Pandas会自动筛选出所有对应mask值为True的行。

内联条件过滤

对于简单的条件,我们通常将生成遮罩的表达式直接写在方括号内,使代码更紧凑。

import pandas as pd

# 重新构建DataFrame
country1 = pd.Series({'Name': '中国', 'Language': 'Chinese', 'Area': '9.597M km2', 'Happiness Rank': 79})
country2 = pd.Series({'Name': '美国', 'Language': 'English (US)', 'Area': '9.834M km2', 'Happiness Rank': 14})
country3 = pd.Series({'Name': '澳大利亚', 'Language': 'English (AU)', 'Area': '7.692M km2', 'Happiness Rank': 9})
df = pd.DataFrame([country1, country2, country3], index=['CH', 'US', 'AU'])

# 内联条件:直接过滤出幸福指数排名前20的国家
top_20_happy = df[df['Happiness Rank'] <= 20]
print("幸福指数排名前20的国家:")
print(top_20_happy)
幸福指数排名前20的国家:
    Name      Language        Area  Happiness Rank
US    美国  English (US)  9.834M km2              14
AU  澳大利亚  English (AU)  7.692M km2               9

这里的 df['Happiness Rank'] <= 20 直接生成了一个布尔遮罩,并立即用于索引。这种方法在数据分析中极其常用。

📝 动手练一练

  1. 概念辨析:.loc 和 .iloc 最主要的区别是什么?在什么情况下你应该选择使用 .iloc 而不是 .loc?
👉 点击查看参考答案
  • 主要区别:.loc 基于索引标签进行选择,而 .iloc 基于整数位置进行选择。
  • 使用 .iloc 的场景:
    • 当你明确知道数据行的数字位置时(例如,总是选择前3行)。
    • 当索引标签是复杂或非连续的值,使用整数位置更方便时。
    • 在编写通用函数时,有时使用位置索引比标签索引更可靠。
  • 关键记忆点:.loc 的切片包含末尾,.iloc 的切片不包含末尾(与Python惯例一致)。
  1. 动手实践:假设我们有一个新的DataFrame df_area,包含Name和Area两列,Area列的格式为类似"9.597M km2"的字符串。请编写代码,使用布尔值遮罩筛选出面积大于 9.5 百万平方公里的国家。 提示:可以使用 Series.str.extract() 配合正则表达式提取数字部分,再转换为数值进行比较。
👉 点击查看参考答案
import pandas as pd

# 构造数据
df_area = pd.DataFrame({
    'Name': ['中国', '美国', '澳大利亚', '俄罗斯', '加拿大'],
    'Area': ['9.597M km2', '9.834M km2', '7.692M km2', '17.100M km2', '9.985M km2']
})

# 参考答案
# 步骤:1) 提取数字部分;2) 转换为浮点数;3) 与9.5比较生成遮罩;4) 应用遮罩。
large_countries = df_area[df_area['Area'].str.extract(r'(\d+\.\d+)')[0].astype(float) > 9.5]
print("面积大于9.5百万平方公里的国家:")
print(large_countries)
面积大于9.5百万平方公里的国家:
  Name         Area
0   中国   9.597M km2
1   美国   9.834M km2
3  俄罗斯  17.100M km2
4  加拿大   9.985M km2

本章小结

本节我们系统梳理了Pandas的核心索引与筛选机制:

  • .loc 与 .iloc 是精确访问数据的“坐标仪”,分别服务于标签和位置两种查询逻辑。
  • 布尔值遮罩 是条件筛选的“过滤器”,它将复杂的数据查询需求转化为直观的真/假判断问题,是数据分析中进行数据子集选取的利器。

📋 行动清单

  • 在笔记本上,对一个自建的DataFrame,分别用 .loc 和 .iloc 练习单行、多行、切片的选取。
  • 针对某个数据列(如数值型的成绩、日期),尝试写出3个不同的条件(如“大于某值”、“在某个范围内”、“等于某值”),并生成对应的布尔遮罩,查看筛选结果。
  • 思考:如果要对多个条件进行组合筛选(例如“说英语 且 幸福指数排名前20”),该如何实现?(提示:可以使用 &(与)、|(或)操作符连接多个布尔遮罩)

—— 小象教研组

配套资料 · 直接下载

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

  • 本节课件:索引操作总结
    PDF · 196KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载