python - 根据条件使用 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))
解决方案
这行得通吗?
(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()
)
推荐阅读
- python - 如何在 Pandas Python 3.X 中划分两个数据帧,并将 NaN、inf 值替换为 0
- android - android studio中构建失败:文件名必须以.xml或.png结尾
- java - 如何修补java库?
- emacs - 在 Geiser/Emacs 中编译 Chicken 文件的问题
- python - Tkinter:在背景图像上覆盖标签
- javascript - 在点击方法vue js上显示元素
- spring-boot - Docker 中的 Sap Java 连接器应用程序
- git - 在`git rebase --abort`和origin remove之后继续rebase
- c# - 反序列化接口对象
- spring - Spring DataSourceTransactionManager 使保存失败