使用Pandas按对应半小时时段的均值填充DataFrame中的NaN值
Pandas按对应半小时时段的均值填充DataFrame中的NaN值
当然可以实现这个需求啦!这是一种非常合理的时间序列缺失值填充方式,用对应半小时时段的整体均值来补全NaN,能很好保留数据的时段特征。下面是具体的实现步骤:
步骤1:确保时间列格式正确并提取半小时时段
首先要保证StartTime是datetime类型(如果原数据还没转换的话),然后提取出对应的半小时时段(比如00:00:00、00:30:00这类时间值):
# 转换StartTime为datetime类型(如果原数据不是的话) Data['StartTime'] = pd.to_datetime(Data['StartTime']) # 提取半小时时段列 Data['HH'] = Data['StartTime'].dt.time
步骤2:计算每个半小时时段的均值
接下来计算每个HH对应的Values列的均值,注意你之前的代码里groupby的列名写错了,应该是['Values']而非['Data']:
# 按HH分组计算均值 hh_means = Data.groupby('HH')['Values'].mean().reset_index()
这一步会得到每个半小时时段的均值表,和你展示的结果一致。
步骤3:用时段均值填充NaN值
这里给你两种简单的实现方式:
方法一:使用map快速映射填充
这种方式代码更简洁,直接把HH列映射到对应的均值来补全NaN:
# 把HH列映射到对应均值,填充Values的NaN Data['Values'] = Data['Values'].fillna(Data['HH'].map(hh_means.set_index('HH')['Values']))
方法二:使用merge合并填充
如果你需要更清晰的中间过程,可以用合并的方式:
# 合并均值表到原数据 Data = Data.merge(hh_means, on='HH', suffixes=('', '_mean')) # 用均值填充NaN Data['Values'] = Data['Values'].fillna(Data['Values_mean']) # 删掉临时的均值列(不需要的话) Data = Data.drop(columns='Values_mean')
验证结果
最后可以检查一下NaN是否都被填充完成:
print(Data.isna().sum().sum())
正常情况下输出应该是0,说明所有NaN都被成功替换了。
备注:内容来源于stack exchange,提问作者K.Best
相关产品推荐
相关产品推荐

