基于另一列变化的行向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.619df.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
相关产品推荐
相关产品推荐

