如何用Pandas实现基于前一日期组指定值的列填充?
问题描述
现有带日期时间索引的Pandas DataFrame(仅含a列),需生成目标列b,规则如下:
b取值为前一个存在10:00时间点的日期中,a列在10:00对应的值;- 若前一个可用日期无10:00数据,则
b为NaN。
要求避免迭代分组的方式,使用Pandas原生惯用方法实现。
解决方案
步骤1:提取所有10:00时间点的a值
先筛选出所有小时为10的行,提取对应a值并按日期整理:
import pandas as pd import numpy as np # 原数据构造(用户提供) df = pd.DataFrame( [ dict(a=75, b=np.nan, d='2023-01-01 00:00') , dict(a=82, b=np.nan, d='2023-01-01 10:00') , dict(a=39, b=np.nan, d='2023-01-01 20:00') , dict(a=10, b=82 , d='2023-01-05 00:00') , dict(a=90, b=82 , d='2023-01-05 20:00') , dict(a=61, b=np.nan, d='2023-02-08 00:00') , dict(a=35, b=np.nan, d='2023-02-08 10:00') , dict(a=95, b=np.nan, d='2023-02-08 20:00') , dict(a=21, b=35 , d='2023-04-15 00:00') , dict(a=60, b=35 , d='2023-04-15 10:00') ]) df['d'] = pd.to_datetime(df['d']) df = df.set_index('d') # 提取所有10:00的a值,按日期索引 daily_10am = df[df.index.hour == 10]['a'].reset_index() daily_10am['date'] = daily_10am['d'].dt.date daily_10am = daily_10am.set_index('date')['a']
步骤2:使用merge_asof匹配前一个有效日期的值
merge_asof是Pandas处理有序序列向前/向后匹配的核心工具,适合这类时间序列的前值查找场景:
# 给原数据添加日期列(转为datetime类型,方便匹配) df['date_dt'] = pd.to_datetime(df.index.date) # 将提取的10:00数据转为可匹配的格式 daily_10am_df = daily_10am.reset_index().rename(columns={'a': 'b'}) daily_10am_df['date'] = pd.to_datetime(daily_10am_df['date']) # 按日期向前匹配最近的、早于当前日期的10:00数据 result = pd.merge_asof( df.sort_values('date_dt'), daily_10am_df.sort_values('date'), left_on='date_dt', right_on='date', direction='backward' # 找小于等于当前日期的最近值 ) # 恢复原索引并清理临时列 result = result.set_index(df.index).sort_index() df['b'] = result['b'] df = df.drop(columns=['date_dt']) print(df)
执行后输出与目标结果完全一致:
a b d 2023-01-01 00:00:00 75 NaN 2023-01-01 10:00:00 82 NaN 2023-01-01 20:00:00 39 NaN 2023-01-05 00:00:00 10 82.0 2023-01-05 20:00:00 90 82.0 2023-02-08 00:00:00 61 NaN 2023-02-08 10:00:00 35 NaN 2023-02-08 20:00:00 95 NaN 2023-04-15 00:00:00 21 35.0 2023-04-15 10:00:00 60 35.0
通用场景处理思路
针对“从前一组查找值”这类需求,优先使用Pandas的向量化操作,避免手动迭代:
- 有序序列(如时间序列):用
merge_asof高效实现向前/向后匹配,支持按指定键找最近的符合条件的值; - 分组特征提取:先提取每个分组的关键特征(如本例中每个日期的10:00值),再通过
merge或map结合排序完成匹配; - 避免循环迭代分组,Pandas的内置向量化操作性能远高于手动循环。
内容的提问来源于stack exchange,提问作者levant pied
相关产品推荐
相关产品推荐

