如何用特定12个月的数据填充DataFrame中的NaN值
解决DataFrame中用最后12个月数据循环填充NaN的问题
解决方案思路
要实现用最后12个月的价格循环填充后续NaN,核心是先提取出作为循环模板的12个月数据,再将该模板重复足够次数后填充到缺失位置,具体步骤如下:
- 确保价格列是数值类型(避免字符串格式导致的计算问题)
- 提取最后12个非空的价格数据作为循环模板
- 计算需要填充的NaN数量,生成对应长度的循环序列
- 将循环序列赋值到NaN所在的行
完整代码实现
import pandas as pd # 构建示例数据 mat = pd.DataFrame(pd.date_range('01/01/2020','01/01/2022',freq='MS')) prices = pd.DataFrame(['179.06','174.6','182.3','205.59','204.78','202.19','216.17','218.69','220.73','223.28','225.16','226.31']) example = pd.concat([mat,prices],axis=1) example.columns = ['maturity', 'price'] # 1. 将价格列转换为数值类型 example['price'] = pd.to_numeric(example['price']) # 2. 提取最后12个非空价格作为循环模板 template = example['price'].dropna().tail(12).values # 3. 计算需要填充的NaN数量,生成循环填充序列 nan_count = example['price'].isna().sum() # 重复模板直到覆盖所有NaN,再截取对应长度 fill_values = template.tolist() * (nan_count // len(template) + 1) fill_values = fill_values[:nan_count] # 4. 填充NaN值 example.loc[example['price'].isna(), 'price'] = fill_values # 查看结果 print(example)
代码说明
- 转换数值类型:原示例中价格是字符串格式,必须转为数值才能进行后续填充操作
- 提取循环模板:
dropna().tail(12)会自动筛选出最后12个非空的价格数据,适配你实际场景中2027-06前最后12个月的有效数据 - 生成循环序列:通过
*运算符重复模板,再截取到需要的长度,确保刚好覆盖所有NaN - 填充NaN:通过
loc定位到NaN的行,直接赋值循环序列
执行后,2021年1-12月会依次填充2020年1-12月的价格,2022年1月填充2020年1月的价格,完美实现循环填充的效果。
内容的提问来源于stack exchange,提问作者ARE
相关产品推荐
相关产品推荐

