首页 > 解决方案 > 如果连续日期不存在,如何根据'ent_id'和'val'列在PANDAS中执行FFILL(),否则需要完成填充?

问题描述

假设我有一个数据框

effective_date,ent_id,val
2020-02-03,101,aa
2020-02-03,102,bn
2020-02-03,103,bd
2020-02-03,105,bv
2020-02-03,106,bs
2020-02-03,107,ba
2020-02-03,109,be


2020-02-04,101,aa
2020-02-04,102,ab
2020-02-04,103,
2020-02-04,104,kl
2020-02-04,105,ad

2020-02-06,101,aa
2020-02-06,102,
2020-02-06,103,bd
2020-02-06,105,bv
2020-02-06,106,cs
2020-02-06,107,
2020-02-06,109,ce
2020-02-06,113,cd
2020-02-06,115,cv
2020-02-06,117,ca

现在我想在ent_idval列的基础上执行前向填充逻辑,如果它在连续日期中不存在,它将对整个列和连续数据执行前向填充,例如2020-02-03,107,ba在连续数据上它会被填充转发,2020-02-04,107,ba但如果ent_idandval存在于连续日期它将在连续日期保持不变,没有其他列值受先前日期数据的影响,例如2020-02-03,103,bd在连续日期它保持不变2020-02-04,103,

所以输出就像

effective_date,ent_id,val
2020-02-03,101,aa
2020-02-03,102,bn
2020-02-03,103,bd
2020-02-03,105,bv
2020-02-03,106,bs
2020-02-03,107,ba
2020-02-03,109,be


2020-02-04,101,aa
2020-02-04,102,ab
2020-02-04,103,
2020-02-04,104,kl
2020-02-04,105,ad
2020-02-04,106,bs
2020-02-04,107,ba
2020-02-04,109,be

2020-02-05,101,aa
2020-02-05,102,ab
2020-02-05,103,
2020-02-05,104,kl
2020-02-05,105,ad
2020-02-05,106,bs
2020-02-05,107,ba
2020-02-05,109,be

2020-02-06,101,aa
2020-02-06,102,
2020-02-06,103,bd
2020-02-06,104,kl
2020-02-06,105,bv
2020-02-06,106,cs
2020-02-06,107,
2020-02-06,109,ce
2020-02-06,113,cd
2020-02-06,115,cv
2020-02-06,117,ca

我的努力

(df.replace(np.nan,987654321).pivot(index='effective_date', columns='ent_id')
   .ffill().asfreq('D',method='ffill')replace(987654321,np.nan).stack().reset_index()
)

这可以满足所有要求,但是请建议有更好的方法。

标签: pythonpandasdataframedata-science

解决方案


推荐阅读