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

Pandas中连接日度与季度数据集后填充空值且保留原始Null的方法

问题描述

我有两个DataFrame,一个是日度数据,一个是季度数据,具体代码如下:

import pandas as pd
import numpy as np

idx = pd.date_range("2023-03-31", periods=100, freq="D")
idx_q = idx.to_series().resample("QE").last()
df1 = pd.DataFrame({"A": [1, "a", None], "B": [4, None, 6]}, index=idx_q)

np.random.seed(42)
df2 = pd.DataFrame({"C": np.random.randn(100), "D": np.random.randn(100)}, index=idx)
# 重采样为工作日数据
df2 = df2.resample("B").asfreq()

# 将df2中大于0.9的值替换为NaN
df2 = df2.mask(df2 > 0.9)

df = df2.join(df1)

我需要将这两个数据集连接,并把季度数据向前填充(ffill)到日度维度,但原始数据中存在的Null值需要在结果中保留,请问正确的填充方式是什么?

解决方案

核心思路是:仅对季度数据对应的列执行向前填充,且保留其原始Null值——只填充季度节点之间的空白日度行,不覆盖原始数据里已有的空值。

可以通过两种方式实现:

方式一:先填充季度数据,再连接

先把季度DataFrame df1 对齐到日度(工作日)维度,用ffill填充空白行,再和日度数据df2连接:

# 将df1重采样到工作日频率,用ffill填充空白行,保留原始Null
df1_filled = df1.reindex(df2.index).ffill()
# 连接两个DataFrame
result = df2.join(df1_filled)

方式二:连接后再填充指定列

如果已经执行了初始的df = df2.join(df1),可以直接对df中来自季度数据的列(A和B)执行ffill:

# 仅对A、B列执行向前填充,保留原始Null
df[["A", "B"]] = df[["A", "B"]].ffill()

原理说明

ffill(向前填充)只会填充相邻的缺失值,不会覆盖原始数据中已存在的Null。比如df1中第三季度的A值为Null,填充后这个Null会一直保留到下一个季度节点(若存在),不会被前面的有效值覆盖。

内容的提问来源于stack exchange,提问作者PaleNeutron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:42:41