【发布时间】:2019-12-25 10:39:57
【问题描述】:
对于以下数据框,我如何填写每个组 city 和 district 的缺失日期,假设完整日期范围是从 2019/1/1 到 2019/6/1,然后用 values 填空 @987654326 @s 前后单元格,如果前后都没有值,则使用bfill 或ffill。
city district date value
0 a d 2019/1/1 9.99
1 a d 2019/2/1 10.66
2 a d 2019/3/1 10.56
3 a d 2019/4/1 10.06
4 a d 2019/5/1 10.69
5 a d 2019/6/1 10.77
6 b e 2019/1/1 9.72
7 b e 2019/2/1 9.72
8 b e 2019/4/1 9.78
9 b e 2019/5/1 9.76
10 b e 2019/6/1 9.66
11 c f 2019/4/1 9.57
12 c f 2019/5/1 9.47
13 c f 2019/6/1 9.39
预期的结果是这样的:
city district date value
0 a d 2019/1/1 9.99
1 a d 2019/2/1 10.66
2 a d 2019/3/1 10.56
3 a d 2019/4/1 10.06
4 a d 2019/5/1 10.69
5 a d 2019/6/1 10.77
6 b e 2019/1/1 9.72
7 b e 2019/2/1 9.72
8 b e 2019/3/1 9.75
9 b e 2019/4/1 9.78
10 b e 2019/5/1 9.76
11 b e 2019/6/1 9.66
12 c f 2019/1/1 9.57
13 c f 2019/2/1 9.57
14 c f 2019/3/1 9.57
15 c f 2019/4/1 9.57
16 c f 2019/5/1 9.47
17 c f 2019/6/1 9.39
如何在 Pandas 中做到这一点?非常感谢。
更新:
当我添加freq = 'M'时,都变成NaNs。
df['date']=pd.to_datetime(df['date'])
( df.set_index('date')
.groupby(['city','district'],as_index=False)
.apply(lambda x: x.reindex(pd.date_range(df.date.min(),df.date.max(), freq = 'M'))
.interpolate()
.bfill()
.ffill())
.rename_axis(index = [0,'date'])
.reset_index()
.drop(0,axis=1)
)
输出:
date city district value
0 2019-01-31 NaN NaN NaN
1 2019-02-28 NaN NaN NaN
2 2019-03-31 NaN NaN NaN
3 2019-04-30 NaN NaN NaN
4 2019-05-31 NaN NaN NaN
5 2019-01-31 NaN NaN NaN
6 2019-02-28 NaN NaN NaN
7 2019-03-31 NaN NaN NaN
8 2019-04-30 NaN NaN NaN
9 2019-05-31 NaN NaN NaN
10 2019-01-31 NaN NaN NaN
11 2019-02-28 NaN NaN NaN
12 2019-03-31 NaN NaN NaN
13 2019-04-30 NaN NaN NaN
14 2019-05-31 NaN NaN NaN
【问题讨论】:
标签: python-3.x pandas dataframe datetime