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
相关产品推荐
相关产品推荐

