You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一列变化的行向Fillna:求Pandas列向高效解决方案

问题描述

有一个包含NaN值的DataFrame:

col_1   col_2
2022-10-31  99.094  102.498
2022-11-30  99.001  101.880
2022-12-31     NaN  108.498
2023-01-31     NaN  100.500

需要用以下公式填充col_1中的NaN值:

desired_val = (当前行col_2值 - 上一行col_2值) + 上一行col_1值

示例计算:

  • df.loc['2022-12-31', 'col_1'] = (108.498 - 101.880) + 99.001 = 105.619
  • df.loc['2023-01-31', 'col_1'] = (100.500 - 108.498) + 105.619 = 97.621

现有逐行填充的方法在大数据集下速度较慢:

for row in df.columns:
        if df.loc[row, 'col_1'] == np.Nan:
            df.loc[row, 'col_1'] = (
              (df['col_2']-df['col_2'].shift(1)
              )
              + df['col_1'].shift(1)
              ).loc[row, 'col_1']

需要基于Pandas的高效列向解决方案。


高效解决方案

核心思路

对填充公式进行变形推导:

col1[t] = col1[t-1] + (col2[t] - col2[t-1])
=> col1[t] - col2[t] = col1[t-1] - col2[t-1]

这说明**col1 - col2的差值是恒定值**——只要按照公式填充,这个差值不会变化。利用这个特性,我们可以用完全矢量化的操作快速完成填充,避免循环带来的性能损耗。

代码实现

import pandas as pd
import numpy as np

# 构造示例数据
data = {
    'col_1': [99.094, 99.001, np.nan, np.nan],
    'col_2': [102.498, 101.880, 108.498, 100.500]
}
df = pd.DataFrame(data, index=['2022-10-31', '2022-11-30', '2022-12-31', '2023-01-31'])

# 计算col1-col2的差值并向前填充(保留有效差值的恒定特性)
diff = df['col_1'] - df['col_2']
diff_filled = diff.ffill()

# 反向计算填充后的col_1:填充后的差值 + col_2
df['col_1'] = diff_filled + df['col_2']

print(df)

输出结果

col_1   col_2
2022-10-31  99.094  102.498
2022-11-30  99.001  101.880
2022-12-31  105.619  108.498
2023-01-31  97.621  100.500

优势

  • 完全采用Pandas矢量化操作,避免循环遍历,在大数据集下性能提升显著
  • 代码简洁逻辑清晰,维护成本低

内容的提问来源于stack exchange,提问作者EMT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:27:37