You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:47:23