查看全课大纲(第 36 / 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.实战:通过移动设备行为数据预测性别和年龄

数据结构-Index

约 7 分钟

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

深入理解 Index 对象

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

在学习了Series和DataFrame这两种核心数据结构后,我们深入探讨另一个贯穿始终的重要概念——索引(Index)。索引不仅是访问数据的”钥匙”,其不可变的特性和丰富的类型也为数据的安全存储与高效查询奠定了基础。本节将系统解析Index的特性、常见类型及重置方法。

💡 核心导读

  • 不可变性:Index对象是”不可变”的,这保障了数据访问的安全与稳定。
  • 常见类型:认识最通用的Index(新版 pandas 中整数索引也归于它,旧版专门的 Int64Index 已在 pandas 2.0 移除)、层级MultiIndex以及时间序列专用的DatetimeIndex。
  • 重置操作:掌握reset_index()方法,灵活地在保留或丢弃原索引之间切换,以适应不同的分析场景。

Index的不可变性

在pandas中,无论是Series的行索引还是DataFrame的行/列索引,其本质都是Index对象。Index有一个非常重要的特性——不可变(immutable)。这意味着一旦创建,索引中的值就不能被单独修改。

这种设计是为了保证数据的安全性。索引是我们定位和访问数据的依据,如果索引值可以随意更改,那么通过索引访问到的数据就可能出错,导致数据不一致。

import pandas as pd
import numpy as np

# 创建一个简单的Series,观察其自动生成的索引
ser_obj = pd.Series([10, 12, 14, 16, 18])
print("创建的Series:")
print(ser_obj)
print("\n其索引为:", ser_obj.index)
print("索引类型:", type(ser_obj.index).__name__)
创建的Series:
0    10
1    12
2    14
3    16
4    18
dtype: int64

其索引为: RangeIndex(start=0, stop=5, step=1)
索引类型: RangeIndex

上面的Series使用默认的RangeIndex,即从0开始的整数序列。现在尝试修改其中一个索引值:

import pandas as pd

# 创建Series并尝试修改索引
ser_obj = pd.Series([10, 12, 14, 16, 18])
print("原始索引的第二个位置的值是:", ser_obj.index[2])

# 尝试修改索引的值(此操作会引发错误)
try:
    ser_obj.index[2] = 10
    print("修改成功")
except Exception as e:
    print("尝试修改索引时发生错误:")
    print(type(e).__name__, ":", e)
原始索引的第二个位置的值是: 2
尝试修改索引时发生错误:
TypeError : Index does not support mutable operations

正如错误信息所示,Index不支持可变操作。任何直接修改索引值的尝试都会引发TypeError。

Index的常见类型

除了上面看到的默认RangeIndex,pandas支持多种索引类型以适应不同的数据场景:

  1. Index:最通用的索引类型,可以存储各种Python对象(通常是字符串)
  2. 整数索引:整数值的索引(旧版 pandas 中有专门的 Int64Index 类型,pandas 2.0 起已移除——整数索引现在就是通用 Index 的一种取值)
  3. MultiIndex:层级索引,用于表示具有多个层次的数据(如”年-月-日”)
  4. DatetimeIndex:时间戳索引,专门用于时间序列数据

让我们通过示例了解字符串索引:

import pandas as pd

# 创建带有自定义字符串索引的 Series
ser_obj_custom = pd.Series([10, 12, 14, 16, 18], index=['a', 'b', 'c', 'd', 'e'])
print("带有自定义索引的 Series:")
print(ser_obj_custom)
print("\n其索引类型为:", type(ser_obj_custom.index).__name__)
print("索引的数据类型为:", ser_obj_custom.index.dtype)
带有自定义索引的 Series:
a    10
b    12
c    14
d    16
e    18
dtype: int64

其索引类型为: Index
索引的数据类型为: str

这里我们创建了一个使用字母作为索引的Series。其索引对象类型是 Index,索引的数据类型为 str(pandas 3.0 起,字符串数据默认使用专门的 str dtype;旧教程里看到的 object 是旧口径,新版已不再这样显示)。

重置索引

虽然不能直接修改索引的单个值,但我们可以整体重置索引。这是通过reset_index()方法实现的,特别适用于当我们需要将当前索引转换为普通数据列,并重新建立默认整数索引的场景。

import pandas as pd

# 创建带有自定义索引的Series
ser_obj_custom = pd.Series([10, 12, 14, 16, 18], index=['a', 'b', 'c', 'd', 'e'])

# 重置索引,默认 drop=False
reset_result = ser_obj_custom.reset_index()
print("使用 reset_index() 重置索引(默认 drop=False):")
print(reset_result)
print("\n重置后的数据类型是:", type(reset_result).__name__)
使用 reset_index() 重置索引(默认 drop=False):
  index   0
0     a  10
1     b  12
2     c  14
3     d  16
4     e  18

重置后的数据类型是: DataFrame

注意:当drop=False(默认值)时,reset_index()会将原来的索引变成新DataFrame的一列(名为”index”),并创建一个新的整数索引。返回值从Series变成了DataFrame。

如果希望重置索引但不保留原来的索引列,可以使用drop=True参数:

import pandas as pd

# 创建带有自定义索引的Series
ser_obj_custom = pd.Series([10, 12, 14, 16, 18], index=['a', 'b', 'c', 'd', 'e'])

# 重置索引,并丢弃旧的索引列
reset_result_dropped = ser_obj_custom.reset_index(drop=True)
print("使用 reset_index(drop=True) 重置索引:")
print(reset_result_dropped)
print("\n重置后的数据类型是:", type(reset_result_dropped).__name__)
使用 reset_index(drop=True) 重置索引:
0    10
1    12
2    14
3    16
4    18
dtype: int64

重置后的数据类型是: Series

当drop=True时,原来的索引被完全丢弃,Series使用新的整数索引(0, 1, 2…),且返回值仍然是Series。

📝 动手练一练

  1. 概念辨析:为什么pandas要将Index设计为不可变的?如果Index是可变的,可能会引发什么问题?
👉 点击查看参考答案

Index的不可变性主要出于数据安全性和一致性的考虑:

  • 数据安全:索引是访问数据的”钥匙”,如果钥匙可以随意改变,通过索引访问到的数据就可能出错
  • 一致性保证:不可变性确保了数据标识的稳定性,避免因索引意外修改导致的数据错位
  • 哈希支持:不可变对象可以被哈希化,这有利于建立高效的查找数据结构

如果Index可变,可能会引发:

  • 数据访问错误:修改索引后,原本通过该索引引用的数据可能指向错误的位置
  • 难以追踪的数据不一致问题
  • 影响基于索引的运算和合并操作的可靠性
  1. 动手实践:创建一个以月份简写(‘Jan’, ‘Feb’, ‘Mar’)为索引的Series,数据为[100, 200, 300]。先查看其索引类型,然后使用reset_index()分别尝试drop=False和drop=True两种参数,观察结果差异。
👉 点击查看参考答案
import pandas as pd

# 创建Series
month_series = pd.Series([100, 200, 300], index=['Jan', 'Feb', 'Mar'])
print("原始Series:")
print(month_series)
print("索引类型:", type(month_series.index).__name__)

# 重置索引,不丢弃原索引
reset_with_index = month_series.reset_index()
print("\nreset_index(drop=False) 结果:")
print(reset_with_index)
print("结果类型:", type(reset_with_index).__name__)

# 重置索引,丢弃原索引
reset_without_index = month_series.reset_index(drop=True)
print("\nreset_index(drop=True) 结果:")
print(reset_without_index)
print("结果类型:", type(reset_without_index).__name__)
原始Series:
Jan    100
Feb    200
Mar    300
dtype: int64
索引类型: Index

reset_index(drop=False) 结果:
  index    0
0   Jan  100
1   Feb  200
2   Mar  300
结果类型: DataFrame

reset_index(drop=True) 结果:
0    100
1    200
2    300
dtype: int64
结果类型: Series

差异总结:

  • drop=False:原索引变为新DataFrame的一列,创建新整数索引,返回DataFrame
  • drop=True:原索引被丢弃,创建新整数索引,返回Series

本章小结

本节深入探讨了pandas中Index这一核心数据结构。Index不仅是数据访问的桥梁,其不可变特性更是数据安全的基石。我们了解了从通用的Index(含整数索引)到高级的MultiIndex、DatetimeIndex的常见类型体系,并掌握了通过reset_index()方法灵活管理索引的技能。

📋 行动清单

  • 在创建Series或DataFrame时,有意识地尝试不同的索引类型(整数、字符串等)
  • 使用reset_index()方法实践索引重置,体会drop参数不同设置的效果差异
  • 思考在实际数据分析场景中,哪些情况需要重置索引(如数据合并后、分组聚合后)

—— 小象教研组

配套资料 · 直接下载

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

  • 本节课件:数据结构-Index
    PDF · 253KB
    下载
  • 全套课件打包(第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 数据库
    下载