Python pandas 使用conditional ffill将月初值填充至当月月末
实现方案
你可以通过保留每月初有效值+ffill向前填充的方式完成需求,完整操作代码如下:
第一步:生成测试DataFrame(已固定时间为2021年12月,方便验证效果)
import pandas as pd import numpy as np from datetime import datetime, timedelta # 固定起始时间为2021-12-01,匹配你描述的测试场景 date_start = datetime(2021,12,1) days = pd.date_range(date_start, date_start + timedelta(35), freq='D') np.random.seed(seed=1111) data = np.random.randint(1, high=100, size=len(days)) df = pd.DataFrame({'test': days, 'col2': data}) df = df.set_index('test')
第二步:核心填充逻辑(使用ffill实现)
简洁分组写法
# 按月份分组,仅保留每月第一天的col2值,其余位置置空后用ffill向前填充整月 df['col2'] = df['col2'].groupby(df.index.to_period("M")).apply( lambda x: x.where(x.index.is_month_start, np.nan).ffill() )
直观辅助列写法
不想用分组逻辑可以选这个方案,可读性更高
# 新增辅助列标记当月第一天 df['is_month_first'] = df.index.is_month_start # 非第一天的col2值置空 df.loc[~df['is_month_first'], 'col2'] = np.nan # ffill填充所有空值 df['col2'] = df['col2'].ffill() # 按需删除辅助列 df.drop('is_month_first', axis=1, inplace=True)
效果验证
运行以下代码可查看12月所有行的填充结果,所有值均为9:
print(df.loc[df.index.month == 12])
内容的提问来源于stack exchange,提问作者Macro Panda
相关产品推荐
相关产品推荐

