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

基于三列匹配条件对Pandas DataFrame执行ffill/bfill日期填充的问题

Pandas按指定条件前向填充START_DATE列实现方案

原代码问题说明

  • 条件判断逻辑错误:cond19中错误将PRODUCT列与SCU_KEY列的移位结果比对
  • 语法错误:不可对ffill()方法的执行结果直接赋值
  • 覆盖场景不全:仅用shift(-1)只能处理相邻两行的匹配场景,无法支持连续多行符合条件的填充需求

参考数据样例

数据样例

正确实现方案

方案1:仅对连续相邻三列值相同的组填充(匹配需求场景)

如果要求仅在连续相邻的SCU_KEY、PRODUCT、REVENUE_STATUS_FLAG三列值一致的范围内填充,需先标记连续分组再执行组内前向填充:

import pandas as pd
import numpy as np

# 第一步:先把START_DATE转为标准日期格式,避免字符串填充出错
df_5['START_DATE'] = pd.to_datetime(df_5['START_DATE'])

# 第二步:标记连续相同的三列组合分组
# 判断当前行与上一行三列是否完全相同,不同则分组标记+1
group_mask = (df_5[['SCU_KEY', 'PRODUCT', 'REVENUE_STATUS_FLAG']] != df_5[['SCU_KEY', 'PRODUCT', 'REVENUE_STATUS_FLAG']].shift()).any(axis=1)
df_5['group_id'] = group_mask.cumsum()

# 第三步:分组内对START_DATE执行前向填充
df_5['START_DATE'] = df_5.groupby('group_id')['START_DATE'].ffill()

# 可选:删除临时生成的group_id列
df_5 = df_5.drop(columns='group_id')

方案2:所有三列值相同的行统一填充(非连续也可填充)

如果允许同一三列组合、不连续的行也统一填充,直接按三列分组即可:

df_5['START_DATE'] = pd.to_datetime(df_5['START_DATE'])
df_5['START_DATE'] = df_5.groupby(['SCU_KEY', 'PRODUCT', 'REVENUE_STATUS_FLAG'])['START_DATE'].ffill()

效果说明

连续相同三列组合的行中,START_DATE会自动向前填充最近的非空值,直到出现三列值不同的行时停止填充,完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:04