基于三列匹配条件对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
相关产品推荐
相关产品推荐

