我有一个带有日期时间的数据框,并且想用 nans 行周围两行的滚动平均值填充缺失值 - 但同时(因此需要 groupby 时间)。不幸的是,下面的方法不起作用。
df = pd.DataFrame({'datetime':['2023-04-20 13:00', '2023-04-21 13:00','2023-04-22 13:00', '2023-04-23 13:00','2023-04-21 14:00', '2023-04-22 14:00', '2023-04-23 14:00'], 'var':[1, 2, np.nan, 3, np.nan, 4, 5]})
df = df.assign(datetime=pd.to_datetime(df.datetime))
df = df.assign(time=df['datetime'].dt.time)
#does not work
df.assign(var=df.groupby('time', sort=False).var.apply(lambda col: col.fillna(col.rolling(window=2, center=2).mean())))
所以我有这个
datetime var
0 2023-04-20 13:00 1.0
1 2023-04-21 13:00 2.0
2 2023-04-22 13:00 NaN
3 2023-04-23 13:00 3.0
4 2023-04-21 14:00 NaN
5 2023-04-22 14:00 4.0
6 2023-04-23 14:00 5.0
并且想要这个
datetime var
0 2023-04-20 13:00 1.0
1 2023-04-21 13:00 2.0
2 2023-04-22 13:00 2.5
3 2023-04-23 13:00 3.0
4 2023-04-21 14:00 4.0
5 2023-04-22 14:00 4.0
6 2023-04-23 14:00 5.0
IIUC,您可以将
pd.Series.interpolate
与 limit_direction='both'
一起使用
df["var"] = df.groupby("time", group_keys=False)["var"].apply(
pd.Series.interpolate, limit_direction="both"
)
print(df)
打印:
datetime var time
0 2023-04-20 13:00:00 1.0 13:00:00
1 2023-04-21 13:00:00 2.0 13:00:00
2 2023-04-22 13:00:00 2.5 13:00:00
3 2023-04-23 13:00:00 3.0 13:00:00
4 2023-04-21 14:00:00 4.0 14:00:00
5 2023-04-22 14:00:00 4.0 14:00:00
6 2023-04-23 14:00:00 5.0 14:00:00