在 Pandas 中,重新索引是一个功能强大的操作,可用于修改 DataFrame 或 Series 的索引。它允许您添加、删除或替换索引中的值,以及重新排列它们的顺序。
重新索引的运作方式
重新索引的基本原理是创建一个新的索引并使用它来分配输入对象中的值。新索引可以更长、更短或与输入索引相同。如果新索引长于输入索引,则将使用填充值(默认为 NaN)进行填充。如果新索引短于输入索引,则将删除输入索引中不在新索引中的项。
更正式地说,重新索引涉及以下步骤:
- 创建一个新的索引。
- 对于新索引中的每个值:
- 查找输入对象中具有该值作为索引的值。
- 如果值存在,则将其赋值给新对象的相应位置。
- 如果值不存在,则使用填充值(默认为 NaN)填充新对象的相应位置。
语法
重新索引的语法如下:
df.reindex(new_index, axis=0, method=None, copy=True, fill_value=None)
其中:
new_index
是新索引,可以是列表、元组或 Index 对象。axis=0
表示重新索引行索引(默认值)。要重新索引列索引,请使用axis=1
。method
指定用于填充新索引中不存在的值的方法。默认值为None
,表示使用 NaN 填充。其他方法包括'ffill'
(向前填充)和'bfill'
(向后填充)。copy=True
表示重新索引后返回一个新对象(默认值)。如果将copy=False
,则将直接修改原始对象。fill_value
指定用于填充新索引中不存在的值的值。默认值为NaN
。
示例
添加索引项
import pandas as pd
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Carol'],
'Age': [20, 25, 30]})
# 添加 "Dave" 索引项
df = df.reindex(df.index.tolist() + ['Dave'])
print(df)
# 输出:
Name Age
0 Alice 20.0
1 Bob 25.0
2 Carol 30.0
3 Dave NaN
删除索引项
df = df.reindex(df.index.tolist()[:-1])
print(df)
# 输出:
Name Age
0 Alice 20.0
1 Bob 25.0
2 Carol 30.0
替换索引
# 替换 "Carol" 为 "Charlie"
df = df.reindex(df.index.set_value(df.index.get_loc('Carol'), 'Charlie'))
print(df)
# 输出:
Name Age
0 Alice 20.0
1 Bob 25.0
2 Charlie 30.0
重新排列索引顺序
# 重新排列索引顺序
df = df.reindex(df.index[::-1])
print(df)
# 输出:
Name Age
2 Charlie 30.0
1 Bob 25.0
0 Alice 20.0
方法
除了 NaN 填充,reindex
还接受以下方法:
'ffill'
(向前填充):值向前填充,即使用前一个索引的值。'bfill'
(向后填充):值向后填充,即使用下一个索引的值。
# 使用向前填充
df = df.reindex(df.index.tolist() + ['Dave'], method='ffill')
# 输出:
Name Age
0 Alice 20.0
1 Bob 25.0
2 Charlie 30.0
3 Dave 30.0
# 使用向后填充
df = df.reindex(df.index.tolist()[:-1], method='bfill')
# 输出:
Name Age
0 Alice 20.0
1 Bob 25.0
2 Charlie 30.0
需要注意的点
- 重新索引可能会改变 DataFrame/Series 的形状。
- 如果新索引重复,则会覆盖重复索引的值。
copy=False
用于提高性能,但可能会产生意外结果。fill_value
可以是标量值或映射,映射将索引值映射到填充值。