Pandas df.reset_index() 函数
df.reset_index() 是 Pandas 中用于重置 DataFrame 行索引的函数。
在数据处理过程中,索引可能会变得不连续或不符合你的需求。reset_index() 可以将索引重置为默认的整数索引(0, 1, 2, ...),或者将当前的索引转换为列。这在数据清洗、排序、筛选后整理数据时非常有用。
基本语法与参数
reset_index() 是 DataFrame 的成员函数,通过点运算符 . 来调用。
语法格式
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
参数说明
| 参数 | 类型 | 是否必填 | 说明 | 默认值 |
|---|---|---|---|---|
| level | int, str, tuple 或 list | 可选 | 指定要重置的索引级别。对于多层索引(MultiIndex),可以选择重置其中某些级别。默认重置所有级别。 | None |
| drop | bool | 可选 | 如果为 True,丢弃原来的索引,不将其转换为列;如果为 False,将原索引作为新列保留。 |
False |
| inplace | bool | 可选 | 如果为 True,直接在原 DataFrame 上修改,不返回新对象;如果为 False,返回一个新的 DataFrame,原数据不变。 |
False |
| col_level | int 或 str | 可选 | 如果列名是多重索引,指定将索引插入到哪个级别。 | 0 |
| col_fill | str | 可选 | 如果列名是多重索引,当原索引被转换为列时,用于填充其他级别的列名。 | '' |
返回值说明
- 返回一个新的 DataFrame(如果
inplace=False),或者None(如果inplace=True)。 - 返回的 DataFrame 中索引已被重置,原索引(如果
drop=False)会作为新列保留。
实例
让我们通过一系列例子,彻底掌握 reset_index() 的用法。
示例 1:基本用法 - 重置索引
最常见的用法是将索引重置为默认的整数索引。
实例
import pandas as pd
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据(默认索引):")
print(df)
print("=" * 50)
# 对数据进行排序,导致索引不连续
df_sorted = df.sort_values(by='成绩', ascending=False)
print("排序后的数据(索引不连续):")
print(df_sorted)
print("=" * 50)
# 重置索引
df_reset = df_sorted.reset_index()
print("重置索引后:")
print(df_reset)
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据(默认索引):")
print(df)
print("=" * 50)
# 对数据进行排序,导致索引不连续
df_sorted = df.sort_values(by='成绩', ascending=False)
print("排序后的数据(索引不连续):")
print(df_sorted)
print("=" * 50)
# 重置索引
df_reset = df_sorted.reset_index()
print("重置索引后:")
print(df_reset)
运行结果预期:
原始数据(默认索引): 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 ================================================== 排序后的数据(索引不连续): 姓名 成绩 1 李四 92 0 张三 85 2 王五 78 ================================================== 重置索引后: 姓名 成绩 index 0 李四 92 1 # 原来的索引作为新列 1 张三 85 0 2 王五 78 2
代码解析:
- 排序后,索引变成了 1、0、2,不再是连续的 0、1、2。
- 使用
reset_index()后,索引重置为 0、1、2。 - 原来的索引作为新列 "index" 被保留下来。
示例 2:使用 drop 参数丢弃原索引
如果不需要保留原索引,可以使用 drop=True 参数。
实例
import pandas as pd
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# 对数据进行排序
df_sorted = df.sort_values(by='成绩', ascending=False)
print("排序后的数据:")
print(df_sorted)
print("=" * 50)
# 重置索引,丢弃原索引
df_reset = df_sorted.reset_index(drop=True)
print("重置索引(丢弃原索引)后:")
print(df_reset)
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# 对数据进行排序
df_sorted = df.sort_values(by='成绩', ascending=False)
print("排序后的数据:")
print(df_sorted)
print("=" * 50)
# 重置索引,丢弃原索引
df_reset = df_sorted.reset_index(drop=True)
print("重置索引(丢弃原索引)后:")
print(df_reset)
运行结果预期:
排序后的数据: 姓名 成绩 1 李四 92 0 张三 85 2 王五 78 ================================================== 重置索引(丢弃原索引)后: 姓名 成绩 0 李四 92 1 张三 85 2 王五 78
代码解析:
- 使用
drop=True后,原来的索引被直接丢弃,不会作为新列保留。 - 这在不需要保留原始索引信息时很有用。
示例 3:筛选数据后重置索引
数据筛选后,索引可能会不连续,使用 reset_index() 可以整理数据。
实例
import pandas as pd
import numpy as np
# 创建一个包含所有学生成绩的 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'成绩': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 筛选成绩大于85的学生
df_filtered = df[df['成绩'] > 85]
print("筛选后的数据(索引不连续):")
print(df_filtered)
print("=" * 50)
# 重置索引
df_reset = df_filtered.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
import numpy as np
# 创建一个包含所有学生成绩的 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'成绩': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 筛选成绩大于85的学生
df_filtered = df[df['成绩'] > 85]
print("筛选后的数据(索引不连续):")
print(df_filtered)
print("=" * 50)
# 重置索引
df_reset = df_filtered.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
运行结果预期:
原始数据: 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 3 赵六 90 4 钱七 88 ================================================== 筛选后的数据(索引不连续): 姓名 成绩 1 李四 92 3 赵六 90 4 钱七 88
代码解析:
- 筛选后保留的是原始索引 1、3、4,不是连续的 0、1、2。
- 使用
reset_index(drop=True)可以得到连续的索引,更便于后续处理。
示例 4:删除重复行后重置索引
删除重复数据后,也可以使用 reset_index() 整理索引。
实例
import pandas as pd
import numpy as np
# 创建一个包含重复行的 DataFrame
data = {
'姓名': ['张三', '李四', '张三', '王五'],
'城市': ['北京', '上海', '北京', '广州']
}
df = pd.DataFrame(data)
print("原始数据(包含重复行):")
print(df)
print("=" * 50)
# 删除重复行
df_unique = df.drop_duplicates()
print("删除重复行后(索引不连续):")
print(df_unique)
print("=" * 50)
# 重置索引
df_reset = df_unique.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
import numpy as np
# 创建一个包含重复行的 DataFrame
data = {
'姓名': ['张三', '李四', '张三', '王五'],
'城市': ['北京', '上海', '北京', '广州']
}
df = pd.DataFrame(data)
print("原始数据(包含重复行):")
print(df)
print("=" * 50)
# 删除重复行
df_unique = df.drop_duplicates()
print("删除重复行后(索引不连续):")
print(df_unique)
print("=" * 50)
# 重置索引
df_reset = df_unique.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
运行结果预期:
原始数据(包含重复行): 姓名 城市 0 张三 北京 1 李四 上海 2 张三 北京 # 重复 3 王五 广州 ================================================== 删除重复行后(索引不连续): 姓名 城市 0 张三 北京 1 李四 上海 3 王五 广州
代码解析:
- 删除重复行后,保留的索引是 0、1、3,不是连续的 0、1、2。
- 重置索引后,数据更加整洁。
示例 5:处理缺失值后重置索引
删除包含缺失值的行后,也可以重置索引。
实例
import pandas as pd
import numpy as np
# 创建一个包含缺失值的 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'成绩': [85, np.nan, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 删除包含缺失值的行
df_cleaned = df.dropna()
print("删除缺失值后(索引不连续):")
print(df_cleaned)
print("=" * 50)
# 重置索引
df_reset = df_cleaned.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
import numpy as np
# 创建一个包含缺失值的 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'成绩': [85, np.nan, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 删除包含缺失值的行
df_cleaned = df.dropna()
print("删除缺失值后(索引不连续):")
print(df_cleaned)
print("=" * 50)
# 重置索引
df_reset = df_cleaned.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
运行结果预期:
原始数据: 姓名 成绩 0 张三 85.0 1 李四 NaN # 缺失值 2 王五 92.0 3 赵六 78.0 ================================================== 删除缺失值后(索引不连续): 姓名 成绩 0 张三 85.0 2 王五 92.0 3 赵六 78.0
代码解析:
- 删除第1行(李四的成绩为 NaN)后,保留的索引是 0、2、3。
- 使用
reset_index()可以得到 0、1、2 的连续索引。
示例 6:使用 inplace 参数原地修改
使用 inplace=True 可以直接在原 DataFrame 上修改。
实例
import pandas as pd
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# 筛选数据
df_filtered = df[df['成绩'] > 80]
print("筛选后的数据(未重置):")
print(df_filtered)
print(f"数据 id: {id(df_filtered)}")
print("=" * 50)
# 使用 inplace=True 原地重置索引
df_filtered.reset_index(drop=True, inplace=True)
print("使用 inplace=True 重置后:")
print(df_filtered)
print(f"数据 id: {id(df_filtered)}")
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# 筛选数据
df_filtered = df[df['成绩'] > 80]
print("筛选后的数据(未重置):")
print(df_filtered)
print(f"数据 id: {id(df_filtered)}")
print("=" * 50)
# 使用 inplace=True 原地重置索引
df_filtered.reset_index(drop=True, inplace=True)
print("使用 inplace=True 重置后:")
print(df_filtered)
print(f"数据 id: {id(df_filtered)}")
运行结果预期:
筛选后的数据(未重置): 姓名 成绩 1 李四 92 0 张三 85 数据 id: 140234567890 ================================================== 使用 inplace=True 重置后: 姓名 成绩 0 李四 92 1 张三 85 数据 id: 140234567890 # 同一个对象
代码解析:
- 使用
inplace=True后,DataFrame 的内存地址(id)不变。 - 这种方法可以节省内存。
示例 7:多层索引的重置
对于多层索引(MultiIndex),可以重置特定级别或全部级别。
实例
import pandas as pd
import numpy as np
# 创建一个多层索引的 DataFrame
df = pd.DataFrame({
'成绩': [85, 92, 78, 88, 90, 95]
}, index=pd.MultiIndex.from_tuples([
('一班', '张三'), ('一班', '李四'), ('一班', '王五'),
('二班', '赵六'), ('二班', '钱七'), ('二班', '孙八')
], names=['班级', '姓名']))
print("原始数据(多层索引):")
print(df)
print("=" * 50)
# 重置所有索引级别
df_reset_all = df.reset_index()
print("重置所有索引级别:")
print(df_reset_all)
print("=" * 50)
# 只重置第一个索引级别(班级)
df_reset_first = df.reset_index(level=0)
print("只重置班级索引:")
print(df_reset_first)
import numpy as np
# 创建一个多层索引的 DataFrame
df = pd.DataFrame({
'成绩': [85, 92, 78, 88, 90, 95]
}, index=pd.MultiIndex.from_tuples([
('一班', '张三'), ('一班', '李四'), ('一班', '王五'),
('二班', '赵六'), ('二班', '钱七'), ('二班', '孙八')
], names=['班级', '姓名']))
print("原始数据(多层索引):")
print(df)
print("=" * 50)
# 重置所有索引级别
df_reset_all = df.reset_index()
print("重置所有索引级别:")
print(df_reset_all)
print("=" * 50)
# 只重置第一个索引级别(班级)
df_reset_first = df.reset_index(level=0)
print("只重置班级索引:")
print(df_reset_first)
运行结果预期:
原始数据(多层索引):
成绩
班级 姓名
一班 张三 85
李四 92
王五 78
二班 赵六 88
钱七 90
孙八 95
==================================================
重置所有索引级别:
班级 姓名 成绩
0 一班 张三 85
1 一班 李四 92
2 一班 王五 78
3 二班 赵六 88
4 二班 钱七 90
5 二班 钱七 95
代码解析:
- 多层索引的 DataFrame 可以使用
reset_index()将索引转换为列。 - 使用
level参数可以选择重置哪个级别的索引。 reset_index()默认不会修改原始 DataFrame,如果想原地修改,使用inplace=True参数。- 默认情况下(
drop=False),原索引会作为新列保留。如果不需要保留,使用drop=True。 - 在使用
reset_index()前,确保没有重要的索引信息需要保留。 - 对于时间序列数据,重置索引后可能需要重新设置时间索引。
- 在链式操作中(如筛选后排序),每次操作后索引都可能变化,适时使用
reset_index()可以保持代码的可预测性。

Pandas 常用函数