如何基于另一索引的ffill/bfill/nearest值构造Pandas Series?
解决方案
一、DatetimeIndex 场景实现
首先构造基础索引和Series:
import pandas as pd idx1 = pd.DatetimeIndex(['2023-06-02', '2023-06-04', '2023-06-06', '2023-06-08', '2023-06-10', '2023-06-12']) idx2 = pd.DatetimeIndex(['2023-06-03', '2023-06-08']) # 构造以idx2为索引、值为自身索引的Series s2 = pd.Series(idx2, index=idx2)
1. 最近值填充(nearest)
直接使用reindex的method='nearest'参数,自动匹配最近的索引值:
nearest_series = s2.reindex(idx1, method='nearest')
输出结果:
2023-06-02 2023-06-03 2023-06-04 2023-06-03 2023-06-06 2023-06-08 2023-06-08 2023-06-08 2023-06-10 2023-06-08 2023-06-12 2023-06-08 dtype: datetime64[ns]
2. 向后填充(bfill)
method='bfill'会取当前索引之后第一个存在的idx2值,无匹配则返回NaN:
bfill_series = s2.reindex(idx1, method='bfill')
输出结果:
2023-06-02 NaT 2023-06-04 2023-06-03 2023-06-06 2023-06-03 2023-06-08 2023-06-08 2023-06-10 2023-06-08 2023-06-12 2023-06-08 dtype: datetime64[ns]
3. 向前填充(ffill)
method='ffill'会取当前索引之前最后一个存在的idx2值,无匹配则返回NaN:
ffill_series = s2.reindex(idx1, method='ffill')
输出结果:
2023-06-02 2023-06-03 2023-06-04 2023-06-08 2023-06-06 2023-06-08 2023-06-08 2023-06-08 2023-06-10 NaT 2023-06-12 NaT dtype: datetime64[ns]
二、数值型等其他有序索引场景
对于数值型索引(如Int64Index、Float64Index),逻辑完全一致——因为reindex的填充方法支持所有有序索引类型。
举个数值型索引示例:
num_idx1 = pd.Int64Index([1, 3, 5, 7, 9, 11]) num_idx2 = pd.Int64Index([2, 8]) s_num = pd.Series(num_idx2, index=num_idx2) # 最近值填充 num_nearest = s_num.reindex(num_idx1, method='nearest') # 向后填充 num_bfill = s_num.reindex(num_idx1, method='bfill') # 向前填充 num_ffill = s_num.reindex(num_idx1, method='ffill')
输出逻辑与DatetimeIndex完全对应:
- 最近值结果:
1→2,3→2,5→8,7→8,9→8,11→8 - 向后填充结果:
1→NaN,3→2,5→2,7→8,9→8,11→8 - 向前填充结果:
1→2,3→8,5→8,7→8,9→NaN,11→NaN
补充说明
- 若需自定义最近值的匹配公差,可在
reindex中添加tolerance参数,比如DatetimeIndex场景设置tolerance=pd.Timedelta(days=1),超过1天的匹配会返回NaN。 - 非有序索引(如无排序逻辑的字符串索引)无法使用
method参数,因为无法定义“前后”或“最近”的逻辑,需通过其他方式(如字符串相似度匹配)处理。
内容的提问来源于stack exchange,提问作者o c
相关产品推荐
相关产品推荐

