如何利用同比变化逆运算填充DataFrame中的NaN值?
解决方案
步骤1:转换Factor列为数值类型
首先需要将Factor列的百分比字符串(如5%)转换为浮点小数(如0.05),方便后续计算:
import pandas as pd # 假设你的DataFrame已按日期索引加载完成 df['Factor'] = df['Factor'].str.replace('%', '').astype(float) / 100
步骤2:按年份层级填充缺失值
缺失值的计算依赖上一年同月的已填充值,可分年份依次处理:
- 2023年缺失值:用2022年同月原始值乘以
(1 + 对应月份的Factor) - 2024年缺失值:用2023年已计算完成的同月值乘以
(1 + 对应月份的Factor)
# 填充2023年数据 df.loc['2023-01-31':'2023-12-31', 'Value Col'] = ( df.loc['2022-01-31':'2022-12-31', 'Value Col'].values * (1 + df.loc['2023-01-31':'2023-12-31', 'Factor']) ) # 填充2024年数据 df.loc['2024-01-31':'2024-12-31', 'Value Col'] = ( df.loc['2023-01-31':'2023-12-31', 'Value Col'].values * (1 + df.loc['2024-01-31':'2024-12-31', 'Factor']) )
通用批量处理方式(适配更多年份)
如果数据包含更多年份,可通过提取月份分组,利用shift自动获取上一年同月的值,无需手动指定年份范围:
# 提取月份作为分组键 df['month'] = df.index.month # 按月份分组,递推填充每组内的缺失值 df['Value Col'] = df.groupby('month').apply( lambda group: group['Value Col'].fillna( group['Value Col'].shift(1) * (1 + group['Factor']) ) ).reset_index(level=0, drop=True) # 删除临时生成的month列 df.drop('month', axis=1, inplace=True)
结果验证
以你提到的2023-04-30为例,计算后的值为:0.018 * (1 + 0.04) = 0.01872,与预期一致。
内容的提问来源于stack exchange,提问作者EMT
相关产品推荐
相关产品推荐

