如何用Pandas基于Factor列差值逐行填充DataFrame的NaN值?
问题:用Pandas矢量化方法填充DataFrame的NaN值
我有一个包含NaN值的DataFrame,希望通过将前一行的Value Col值与Factor列的变化值(绝对值)相加来填充NaN。初始DataFrame如下:
Value Col Factor 2022-11-30 0.020 84 2022-12-31 0.015 77 2023-01-31 NaN 90 2023-02-28 NaN 44 2023-03-31 NaN 39
填充规则示例:
- 填充
df.iloc[2, 0]时,取df.iloc[1,0]与Factor列的差值绝对值(90-77=13)相加,得到0.015+13=13.015 - 后续行以此类推,最终预期输出如下:
Value Col Factor 2022-11-30 0.020 84 2022-12-31 0.015 77 2023-01-31 13.015 90 2023-02-28 59.015 44 2023-03-31 64.015 39
我已用for loop实现该需求,但想找到基于Pandas函数的逐行填充方法,目前已通过df['Factor'].diff(1)获取Factor列差值,却不知如何以此逐行填充NaN。
解决方案
你可以通过计算差值累加序列结合fillna()实现矢量化填充,无需循环,步骤如下:
1. 构建示例DataFrame
import pandas as pd # 创建初始DataFrame df = pd.DataFrame({ 'Value Col': [0.020, 0.015, None, None, None], 'Factor': [84, 77, 90, 44, 39] }, index=pd.to_datetime(['2022-11-30', '2022-12-31', '2023-01-31', '2023-02-28', '2023-03-31']))
2. 定位最后一个非NaN值的位置
找到Value Col中最后一个有有效值的行,以此作为填充的起始基准:
last_valid_idx = df['Value Col'].last_valid_index()
3. 计算Factor列的差值绝对值并累加
从基准行开始,计算Factor列的相邻差值绝对值,再做累加:
# 计算基准行及之后的Factor差值绝对值 factor_diff_after = df.loc[last_valid_idx:, 'Factor'].diff().abs() # 累加差值,再加上基准行的Value值,得到填充序列 fill_series = df.loc[last_valid_idx, 'Value Col'] + factor_diff_after.cumsum()
4. 填充NaN值
用生成的填充序列替换Value Col中的NaN:
df['Value Col'] = df['Value Col'].fillna(fill_series)
运行后即可得到预期的结果:
Value Col Factor 2022-11-30 0.020 84 2022-12-31 0.015 77 2023-01-31 13.015 90 2023-02-28 59.015 44 2023-03-31 64.015 39
内容的提问来源于stack exchange,提问作者EMT
相关产品推荐
相关产品推荐

