关于Pandas中reindex方法ffill年末填充行为的疑问与解释请求
关于pandas reindex(method='ffill')的行为解释
我有一个记录交易日股价的DataFrame p。使用reindex并设置method='ffill'为年末日期重新索引时,2023-12-31会被原样本中2023年最后一个交易日(2023-12-29)的值前向填充;但当2023-12-29的值被设为NaN后,2023-12-31却不会被2023-12-28的值填充。下面解释这个行为,帮你理解reindex的工作原理。
原始数据示例
p['Stock A'].loc[pd.Timestamp(2023,12,25):].head(10) # 输出: # 2023-12-26 5.3418 # 2023-12-27 5.4445 # 2023-12-28 5.8143 # 2023-12-29 5.9273 # 2024-01-02 NaN # 2024-01-03 NaN # Name: Stock A, dtype: float64
Stock A的reindex结果
p['Stock A'].reindex( pd.DatetimeIndex(['2022-12-31', '2023-12-31', '2024-12-11'], dtype='datetime64[ns]', freq=None), method='ffill' ) # 输出: # 2022-12-31 14.4229 # 2023-12-31 5.9273 # 2024-12-11 NaN # Name: Stock A, dtype: float64
Stock B的reindex结果(2023-12-29设为NaN)
p['Stock B'] = p['Stock A'] p.loc[pd.Timestamp(2023,12,29), 'Stock B'] = np.nan p['Stock B'].reindex( pd.DatetimeIndex(['2022-12-31', '2023-12-31', '2024-12-11'], dtype='datetime64[ns]', freq=None), method='ffill' ) # 输出: # 2022-12-31 14.4229 # 2023-12-31 NaN # 2024-12-11 NaN # Name: Stock B, dtype: float64
行为解释
核心逻辑是:pandas的reindex搭配method='ffill'时,只会从原索引中存在的、目标日期之前的最后一个条目取值填充,不会自动跳过该条目中的NaN去寻找更早的有效值。
- 对于Stock A:原索引中2023-12-29是小于2023-12-31的最后一个交易日,且值为非NaN,所以
ffill直接用这个值填充2023-12-31。 - 对于Stock B:原索引中2023-12-29仍然是小于2023-12-31的最后一个交易日,但该条目的值是NaN。
reindex的ffill不会忽略这个NaN去取更早的2023-12-28的值,因此2023-12-31的结果为NaN。
如果想要实现跳过原索引中的NaN进行填充,可以先对原Series做ffill预处理,再执行reindex:
# 先填充原Series中的NaN,再重新索引 p['Stock B'].ffill().reindex( pd.DatetimeIndex(['2022-12-31', '2023-12-31', '2024-12-11'], dtype='datetime64[ns]', freq=None) )
内容的提问来源于stack exchange,提问作者cpage
相关产品推荐
相关产品推荐

