如何根据 'ent_id' 在 PANDAS 中执行前向填充逻辑(如果连续日期不存在则执行前向填充?
How to perform forward fill logic in PANDAS based on 'ent_id' if it does not exist for successive date then perform forward fill?
假设我有一个数据框
effective_date,ent_id,val
2020-02-03,101,aa
2020-02-03,102,ab
2020-02-03,103,ac
2020-02-03,105,ad
2020-02-04,107,ba
2020-02-04,103,bd
2020-02-04,105,bv
2020-02-04,106,bs
2020-02-04,109,be
2020-02-04,102,bn
2020-02-05,117,ca
2020-02-05,113,cd
2020-02-05,115,cv
2020-02-05,106,cs
2020-02-05,109,ce
2020-02-05,102,cn
并且输出会是这样的,即如果 ent_id 在后续日期不存在,则向前填充它
例如与 effective_date '2020-02-04' 一样,我们没有 ent_id 作为 101,因此它被转发到下一个日期,即 2020-02-04,101,aa,其他日期也类似
effective_date,ent_id,val
2020-02-03,101,aa
2020-02-03,102,ab
2020-02-03,103,ac
2020-02-03,105,ad
2020-02-04,101,aa
2020-02-04,107,ba
2020-02-04,103,bd
2020-02-04,105,bv
2020-02-04,106,bs
2020-02-04,109,be
2020-02-04,102,bn
2020-02-05,101,aa
2020-02-05,107,ba
2020-02-05,103,bd
2020-02-05,105,bv
2020-02-05,117,ca
2020-02-05,113,cd
2020-02-05,115,cv
2020-02-05,106,cs
2020-02-05,109,ce
2020-02-05,102,cn
我的努力
df['effective_date'] = pd.to_datetime(df['effective_date'])
df1 = (df.set_index(['effective_date',df.groupby('effective_date').cumcount()])
.unstack()
.ffill()
.stack()
.reset_index(level=1, drop=True)
.reset_index())
但它没有提供预期的输出
您可以旋转、填充,然后取消堆叠:
(df.pivot(index='effective_date', columns='ent_id')
.ffill().stack().reset_index()
)
输出:
effective_date ent_id val
0 2020-02-03 101 aa
1 2020-02-03 102 ab
2 2020-02-03 103 ac
3 2020-02-03 105 ad
4 2020-02-04 101 aa
5 2020-02-04 102 bn
6 2020-02-04 103 bd
7 2020-02-04 105 bv
8 2020-02-04 106 bs
9 2020-02-04 107 ba
10 2020-02-04 109 be
11 2020-02-05 101 aa
12 2020-02-05 102 cn
13 2020-02-05 103 bd
14 2020-02-05 105 bv
15 2020-02-05 106 cs
16 2020-02-05 107 ba
17 2020-02-05 109 ce
18 2020-02-05 113 cd
19 2020-02-05 115 cv
20 2020-02-05 117 ca
假设我有一个数据框
effective_date,ent_id,val
2020-02-03,101,aa
2020-02-03,102,ab
2020-02-03,103,ac
2020-02-03,105,ad
2020-02-04,107,ba
2020-02-04,103,bd
2020-02-04,105,bv
2020-02-04,106,bs
2020-02-04,109,be
2020-02-04,102,bn
2020-02-05,117,ca
2020-02-05,113,cd
2020-02-05,115,cv
2020-02-05,106,cs
2020-02-05,109,ce
2020-02-05,102,cn
并且输出会是这样的,即如果 ent_id 在后续日期不存在,则向前填充它 例如与 effective_date '2020-02-04' 一样,我们没有 ent_id 作为 101,因此它被转发到下一个日期,即 2020-02-04,101,aa,其他日期也类似
effective_date,ent_id,val
2020-02-03,101,aa
2020-02-03,102,ab
2020-02-03,103,ac
2020-02-03,105,ad
2020-02-04,101,aa
2020-02-04,107,ba
2020-02-04,103,bd
2020-02-04,105,bv
2020-02-04,106,bs
2020-02-04,109,be
2020-02-04,102,bn
2020-02-05,101,aa
2020-02-05,107,ba
2020-02-05,103,bd
2020-02-05,105,bv
2020-02-05,117,ca
2020-02-05,113,cd
2020-02-05,115,cv
2020-02-05,106,cs
2020-02-05,109,ce
2020-02-05,102,cn
我的努力
df['effective_date'] = pd.to_datetime(df['effective_date'])
df1 = (df.set_index(['effective_date',df.groupby('effective_date').cumcount()])
.unstack()
.ffill()
.stack()
.reset_index(level=1, drop=True)
.reset_index())
但它没有提供预期的输出
您可以旋转、填充,然后取消堆叠:
(df.pivot(index='effective_date', columns='ent_id')
.ffill().stack().reset_index()
)
输出:
effective_date ent_id val
0 2020-02-03 101 aa
1 2020-02-03 102 ab
2 2020-02-03 103 ac
3 2020-02-03 105 ad
4 2020-02-04 101 aa
5 2020-02-04 102 bn
6 2020-02-04 103 bd
7 2020-02-04 105 bv
8 2020-02-04 106 bs
9 2020-02-04 107 ba
10 2020-02-04 109 be
11 2020-02-05 101 aa
12 2020-02-05 102 cn
13 2020-02-05 103 bd
14 2020-02-05 105 bv
15 2020-02-05 106 cs
16 2020-02-05 107 ba
17 2020-02-05 109 ce
18 2020-02-05 113 cd
19 2020-02-05 115 cv
20 2020-02-05 117 ca