reindex
方法会创建一个新对象,并根据给定的新 index
对原来 Series 的数据重新组织。如果新 index
中有原来 index
不存在的 label,那么这些 label 对应位置会被填充 NaN
:
import pandas as pd
import numpy as nps1 = pd.Series([4.5, 7.2, 6.6, 5.8], index=['d', 'a', 'c', 'b'])
s1
"""
d 4.5
a 7.2
c 6.6
b 5.8
dtype: float64
"""
s2 = s1.reindex(['a', 'b', 'c', 'd', 'e'])
s2
"""
a 7.2
b 5.8
c 6.6
d 4.5
e NaN
dtype: float64
"""
通常我们想对 NaN
的位置填充一些值,这可以通过 reindex
方法的 method
参数来实现。
method{None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}
pad/ffill
:会将上一个非 NaN
的值填充到此位置;
backfill/bfill
:会将下一个非 NaN
的值填充到此位置;
nearest
:会将最靠近的非 NaN
的值填充到此位置
s3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
s3
"""
0 blue
2 purple
4 yellow
dtype: object
"""
s3.reindex(range(6), method='ffill')
"""
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object
"""
如果我们想要在 NaN
位置填充自己想要的值,可以传入 fill_value
参数:
s3.reindex(range(6), fill_value='red')
"""
0 blue
1 red
2 purple
3 red
4 yellow
5 red
dtype: object
"""
对于 DataFrame,reindex
方法既可以改变行标(index
),也可以改变列标(column
),或者两者同时改变。
df = pd.DataFrame(np.arange(9).reshape((3, 3)),index=['a', 'c', 'd'],columns=['BeiJ', 'ShangH', 'shenZ'])
print(df)
"""BeiJ ShangH shenZ
a 0 1 2
c 3 4 5
d 6 7 8
"""
如果 reindex
中只传入一个序列,那么默认会改变 index
:
df.reindex(['a', 'b', 'c', 'd'])
"""BeiJ ShangH shenZ
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
"""
如果想要改变列标,那么可以指定 columns
关键字:
df.reindex(columns=['BeiJ', 'XiA', 'shenZ'])
"""BeiJ XiA shenZ
a 0 NaN 2
c 3 NaN 5
d 6 NaN 8
"""
DataFrame 的 reindex
方法也有 method
和 fill_value
参数,含义与之前相同。
下面我们看这样一个例子:
date_index = pd.date_range('1/1/2023', periods=6, freq='D')
df = pd.DataFrame({"prices": [100, 101, np.nan, 100, 89, 88]},index=date_index)
print(df)
"""prices
2023-01-01 100.0
2023-01-02 101.0
2023-01-03 NaN
2023-01-04 100.0
2023-01-05 89.0
2023-01-06 88.0
"""
对 df
进行扩充:
date_index2 = pd.date_range('12/29/2022', periods=10, freq='D')
df.reindex(date_index2)
"""prices
2022-12-29 NaN
2022-12-30 NaN
2022-12-31 NaN
2023-01-01 100.0
2023-01-02 101.0
2023-01-03 NaN
2023-01-04 100.0
2023-01-05 89.0
2023-01-06 88.0
2023-01-07 NaN
"""
如果使用 bfill
填充 NaN
:
df.reindex(date_index2, method='bfill')
"""prices
2022-12-29 100.0
2022-12-30 100.0
2022-12-31 100.0
2023-01-01 100.0
2023-01-02 101.0
2023-01-03 NaN
2023-01-04 100.0
2023-01-05 89.0
2023-01-06 88.0
2023-01-07 NaN
"""
注意到有两个 NaN
并没有被填充。最后一个 NaN
未被填充是因为它后面没有可供 bfill
来填充的值了。而中间的 NaN
则是因为原本的 df
该位置的值就为 NaN
,reindex
中的填充 method
不会对此进行填充。
[1] NumPy Reference. https://numpy.org/doc/stable/reference/index.html
[2] Python for Data Analysis, 2nd^{\rm nd}nd edition. Wes McKinney.
下一篇:C++代码重用(一)