在 Pandas 中,每一行都有一个标签,这个标签就是行索引,它不像列名那样在列的顶部显示,而是位于 DataFrame 的最左侧,行索引的主要作用是:

- 唯一标识:快速、唯一地定位到某一行或某几行数据。
- 数据对齐:在进行算术运算、合并等操作时,Pandas 会根据行索引自动对齐数据。
- 数据筛选:可以方便地通过索引选择、筛选数据。
如何获取行索引
使用 DataFrame 的 .index 属性可以获取行索引。
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
data = {'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 35],
'城市': ['北京', '上海', '广州', '深圳']}
df = pd.DataFrame(data)
# 默认情况下,行索引是 0, 1, 2, 3...
print("原始 DataFrame:")
print(df)
print("\n")
# 获取行索引
print("行索引对象:")
print(df.index)
print("\n")
# 获取行索引的类型
print("行索引的类型:", type(df.index))
输出:
原始 DataFrame:
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 28 广州
3 赵六 35 深圳
行索引对象:
RangeIndex(start=0, stop=4, step=1)
行索引的类型: <class 'pandas.core.indexes.range.RangeIndex'>
可以看到,默认情况下,Pandas 创建了一个 RangeIndex,这是一个从 0 开始的整数索引。
如何设置或修改行索引
你可以将 DataFrame 中的任何一列设置为新的行索引。

使用 set_index() 方法
这是最常用的方法,它会返回一个新的 DataFrame,原 DataFrame 不会被修改(除非使用 inplace=True)。
# 将 '姓名' 列设置为行索引
df_indexed_by_name = df.set_index('姓名')
print("将 '姓名' 设为行索引后的 DataFrame:")
print(df_indexed_by_name)
print("\n")
# 查看新的行索引
print("新的行索引:", df_indexed_by_name.index)
输出:
将 '姓名' 设为行索引后的 DataFrame:
年龄 城市
姓名
张三 25 北京
李四 30 上海
王五 28 广州
赵六 35 深圳
新的行索引: Index(['张三', '李四', '王五', '赵六'], dtype='object')
inplace=True 参数
如果你希望直接在原 DataFrame 上修改,而不是创建一个新的,可以使用 inplace=True。
print("修改前的 df:")
print(df)
print("\n")
# 直接在原 DataFrame 上修改
df.set_index('姓名', inplace=True)
print("修改后的 df:")
print(df)
输出:

修改前的 df:
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 28 广州
3 赵六 35 深圳
修改后的 df:
年龄 城市
姓名
张三 25 北京
李四 30 上海
王五 28 广州
赵六 35 深圳
设置多列为索引
你也可以将多列组合成一个多级索引(或称分层索引)。
# 重置索引以便演示
df.reset_index(inplace=True)
# 将 '城市' 和 '姓名' 两列设置为多级索引
df_multi_indexed = df.set_index(['城市', '姓名'])
print("多级索引 DataFrame:")
print(df_multi_indexed)
print("\n")
print("多级索引对象:")
print(df_multi_indexed.index)
输出:
多级索引 DataFrame:
年龄
城市 姓名
北京 张三 25
上海 李四 30
广州 王五 28
深圳 赵六 35
多级索引对象:
MultiIndex([(北京, 张三),
(上海, 李四),
(广州, 王五),
(深圳, 赵六)],
names=['城市', '姓名'])
如何重置行索引
如果你想把当前的行索引变回默认的整数索引(0, 1, 2, ...),可以使用 reset_index() 方法。
默认情况下,reset_index() 会将旧的索引变成一个新的列。
# 假设 df 当前有一个 '姓名' 行索引
print("重置前的 df (索引为 '姓名'):")
print(df)
print("\n")
# 重置索引
df_reset = df.reset_index()
print("重置索引后的 df:")
print(df_reset)
输出:
重置前的 df (索引为 '姓名'):
年龄 城市
姓名
张三 25 北京
李四 30 上海
王五 28 广州
赵六 35 深圳
重置索引后的 df:
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 28 广州
3 赵六 35 深圳
drop=True 参数
如果你不希望将旧索引保留为列,而是直接丢弃它,可以使用 drop=True。
# 直接丢弃旧索引,不创建新列
df_reset_dropped = df.reset_index(drop=True)
print("使用 drop=True 重置索引后的 df:")
print(df_reset_dropped)
输出:
使用 drop=True 重置索引后的 df:
年龄 城市
0 25 北京
1 30 上海
2 28 广州
3 35 深圳
如何修改单个行索引的值
如果你想修改特定行的索引标签,可以使用 .index 的 __setitem__ 方法(即 df.index[i] = new_value)。
# 假设 df 的索引是 ['张三', '李四', '王五', '赵六']
print("修改前的索引:", df.index)
print(df)
print("\n")
# 将 '王五' 的索引修改为 '王五(组长)'
df.index[2] = '王五(组长)'
print("修改后的索引:", df.index)
print("\n")
print("修改后的 DataFrame:")
print(df)
输出:
修改前的索引: Index(['张三', '李四', '王五', '赵六'], dtype='object', name='姓名')
年龄 城市
姓名
张三 25 北京
李四 30 上海
王五 28 广州
赵六 35 深圳
修改后的索引: Index(['张三', '李四', '王五(组长)', '赵六'], dtype='object', name='姓名')
修改后的 DataFrame:
年龄 城市
姓名
张三 25 北京
李四 30 上海
王五(组长) 28 广州
赵六 35 深圳
如何重命名行索引
如果你想把整个索引的名称改掉,而不是修改索引的值,可以使用 .name 属性。
# 假设 df 的索引名称是 '姓名'
print("修改前的索引名称:", df.index.name)
# 修改索引名称
df.index.name = '员工姓名'
print("修改后的索引名称:", df.index.name)
print("\n")
print("索引名称修改后的 DataFrame:")
print(df)
输出:
修改前的索引名称: 姓名
修改后的索引名称: 员工姓名
索引名称修改后的 DataFrame:
年龄 城市
员工姓名
张三 25 北京
李四 30 上海
王五(组长) 28 广州
赵六 35 深圳
如何通过索引选择行
这是行索引最重要的应用之一。
使用 .loc (基于标签)
.loc 使用行和列的进行选择。
# 选择索引为 '李四' 的行
print("选择索引为 '李四' 的行:")
print(df.loc['李四'])
print("\n")
# 选择多个索引
print("选择 '张三' 和 '赵六' 的行:")
print(df.loc[['张三', '赵六']])
print("\n")
# 使用切片 (注意:与 Python 列表不同,loc 的切片是包含结束标签的)
print("选择从 '李四' 到 '王五(组长)' 的行:")
print(df.loc['李四':'王五(组长)'])
使用 .iloc (基于整数位置)
.iloc 使用行和列的整数位置(从 0 开始)进行选择,与索引的标签无关。
# 选择第 1 行 (索引是 '李四')
print("选择第 1 行 (位置 1):")
print(df.iloc[1])
print("\n")
# 选择第 0 行和第 3 行
print("选择第 0 行和第 3 行:")
print(df.iloc[[0, 3]])
print("\n")
# 使用切片 (与 Python 列表行为一致,不包含结束位置)
print("选择从第 1 行到第 2 行 (位置 1 到 2):")
print(df.iloc[1:3])
| 操作 | 方法/属性 | 描述 | 示例 |
|---|---|---|---|
| 获取索引 | df.index |
获取当前 DataFrame 的行索引对象。 | print(df.index) |
| 设置索引 | df.set_index('列名') |
将指定列设置为新的行索引,返回新 DataFrame。 | df = df.set_index('姓名') |
| 原地设置索引 | df.set_index('列名', inplace=True) |
直接在原 DataFrame 上修改索引。 | df.set_index('年龄', inplace=True) |
| 重置索引 | df.reset_index() |
将索引变回默认整数索引,旧索引变为新列。 | df = df.reset_index() |
| 重置并丢弃索引 | df.reset_index(drop=True) |
将索引变回默认整数索引,并丢弃旧索引。 | df.reset_index(drop=True, inplace=True) |
| 修改索引值 | df.index[i] = '新值' |
修改第 i 个索引标签的值。 |
df.index[0] = '新员工' |
| 重命名索引 | df.index.name = '新名称' |
修改整个索引的名称。 | df.index.name = 'ID' |
| 按标签选行 | df.loc['标签'] |
根据行标签选择一行或多行。 | df.loc['李四'] |
| 按位置选行 | df.iloc[位置] |
根据行整数位置选择一行或多行。 | df.iloc[1] |
掌握这些操作,你就可以灵活地管理和操作 Pandas DataFrame 的行索引了。
