首页 > 解决方案 > 根据条件使用 ffill 和 bfill

问题描述

我正在尝试根据我的数据框的特定条件来填充和填充。
基本上对于在下面具有相同行的条目['SCU_KEY', 'PRODUCT', 'REVENUE_STATUS_FLAG'],然后我想前面填充(填充)'START_DATE',直到它不再共享所有 3 列条件。
bfill 将是相同的,但对于上面的所有行,而不是“START_DATE”,它将是“END_DATE”。
由于代码显然大致相同,我们可以忽略“END_DATE”代码以避免不必要的工作。
我附上了一些数据的图像并作为记录,我希望第一行的“START_DATE”:“2020-06-30”(索引 #1041)与下一行相同(显示“2018-02-24” ')。
另一个示例可以显示从索引 #1593 开始,START_DATE 为“2020-11-02”,并且该数字将被“填充”直到索引 #1769 以替换所有条目,直到您看到“2018-05-01”。
这是我的未完成尝试的代码:

在此处输入图像描述

cond18 = df_5['SCU_KEY'] == df_5['SCU_KEY'].shift(-1)
cond19 = df_5['PRODUCT'] == df_5['SCU_KEY'].shift(-1)
cond20 = df_5['REVENUE_STATUS_FLAG'] == df_5['REVENUE_STATUS_FLAG'].shift(-1)
df_5['START_DATE'].ffill() = np.where((cond18) & (cond19) & (cond20), df_5['START_DATE'], df_5['START_DATE'].shift(-1))

标签: pythonpandas

解决方案


这行得通吗?

(df
  .groupby(['SCU_KEY', 'PRODUCT', 'REVENUE_STATUS_FLAG'])
  .apply(lambda x: x.assign(START_DATE = lambda x: x['START_DATE'].ffill()))
  .reset_index()
  .groupby(['SCU_KEY', 'PRODUCT', 'REVENUE_STATUS_FLAG'])
  .apply(lambda x: x.assign(END_DATE = lambda x: x['END_DATE'].bfill()))
  .reset_index()
)

推荐阅读