reindex()
是 pandas 里实现数据对齐的基本方法,该方法执行几乎所有功能都要用到的标签对齐功能。 reindex
指的是沿着指定轴,让数据与给定的一组标签进行匹配。该功能完成以下几项操作:
让现有数据匹配一组新标签,并重新排序;
在无数据但有标签的位置插入缺失值(
NA
)标记;如果指定,则按逻辑填充无标签的数据,该操作多见于时间序列数据。
示例如下:
In [196]: s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
In [197]: s
Out[197]:
a 1.695148
b 1.328614
c 1.234686
d -0.385845
e -1.326508
dtype: float64
In [198]: s.reindex(['e', 'b', 'f', 'd'])
Out[198]:
e -1.326508
b 1.328614
f NaN
d -0.385845
dtype: float64
本例中,原 Series 里没有标签 f
,因此,输出结果里 f
对应的值为 NaN
。
DataFrame 支持同时 reindex
索引与列:
In [199]: df
Out[199]:
one two three
a 1.394981 1.772517 NaN
b 0.343054 1.912123 -0.050390
c 0.695246 1.478369 1.227435
d NaN 0.279344 -0.613172
In [200]: df.reindex(index=['c', 'f', 'b'], columns=['three', 'two', 'one'])
Out[200]:
three two one
c 1.227435 1.478369 0.695246
f NaN NaN NaN
b -0.050390 1.912123 0.343054
reindex
还支持 axis
关键字:
In [201]: df.reindex(['c', 'f', 'b'], axis='index')
Out[201]:
one two three
c 0.695246 1.478369 1.227435
f NaN NaN NaN
b 0.343054 1.912123 -0.050390
注意:不同对象可以共享 Index
包含的轴标签。比如,有一个 Series,还有一个 DataFrame,可以执行下列操作:
In [202]: rs = s.reindex(df.index)
In [203]: rs
Out[203]:
a 1.695148
b 1.328614
c 1.234686
d -0.385845
dtype: float64
In [204]: rs.index is df.index
Out[204]: True
这里指的是,重置后,Series 的索引与 DataFrame 的索引是同一个 Python 对象。
0.21.0 版新增。
DataFrame.reindex()
还支持 “轴样式”调用习语,可以指定单个 labels
参数,并指定应用于哪个 axis
。
In [205]: df.reindex(['c', 'f', 'b'], axis='index')
Out[205]:
one two three
c 0.695246 1.478369 1.227435
f NaN NaN NaN
b 0.343054 1.912123 -0.050390
In [206]: df.reindex(['three', 'two', 'one'], axis='columns')
Out[206]:
three two one
a NaN 1.772517 1.394981
b -0.050390 1.912123 0.343054
c 1.227435 1.478369 0.695246
d -0.613172 0.279344 NaN
::: tip 注意
多重索引与高级索引介绍了怎样用更简洁的方式重置索引。
:::
::: tip 注意
编写注重性能的代码时,最好花些时间深入理解 reindex
:预对齐数据后,操作会更快。两个未对齐的 DataFrame 相加,后台操作会执行 reindex
。探索性分析时很难注意到这点有什么不同,这是因为 reindex
已经进行了高度优化,但需要注重 CPU 周期时,显式调用 reindex
还是有一些影响的。
:::
重置索引,并与其它对象对齐
提取一个对象,并用另一个具有相同标签的对象 reindex
该对象的轴。这种操作的语法虽然简单,但未免有些啰嗦。这时,最好用 reindex_like()
方法,这是一种既有效,又简单的方式:
In [207]: df2
Out[207]:
one two
a 1.394981 1.772517
b 0.343054 1.912123
c 0.695246 1.478369
In [208]: df3
Out[208]:
one two
a 0.583888 0.051514
b -0.468040 0.191120
c -0.115848 -0.242634
In [209]: df.reindex_like(df2)
Out[209]:
one two
a