Pandas跳过NaN取相邻非空行计算能量损耗列方法
Pandas 相邻非空行计算能量损耗列实现方案
不要用逐行lambda向后查找非空值的写法,效率低且边界判断容易出错,用非空值提取+序列对齐的向量化方案即可实现,步骤如下:
- 第一步:提取Energy列所有非空值,自动保留原始行索引
- 第二步:对提取出的有效序列,通过移位拿到相邻的上一个有效值,按公式计算损耗,计算结果自动对齐到两个相邻有效值的后一行位置
- 第三步:将计算结果直接赋值回原DataFrame,未匹配到计算结果的位置自动保留为NaN,符合需求规则
基础数值计算版本(常规使用场景)
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'Energy': [np.nan, np.nan, np.nan, 4, np.nan, 3, np.nan, 11, 3, np.nan, 14] }) # 核心计算逻辑 valid_energy = df['Energy'].dropna() # 公式:0.5 * (前一个相邻有效Energy值² - 当前有效Energy值²) loss_calc = 0.5 * (valid_energy.shift(1) ** 2 - valid_energy ** 2) df['loss'] = loss_calc
注:你给出的示例表格中仅在后一个有效值小于前一个值时输出了损耗结果,且11与相邻3的计算式存在数字顺序笔误。如果需要严格匹配示例的显示效果,只需要在计算后增加一行过滤逻辑,将后值大于等于前值的损耗置为NaN即可:
# 后值大于等于前值时不计算损耗,置为NaN loss_calc[valid_energy >= valid_energy.shift(1)] = np.nan df['loss'] = loss_calc执行后结果和示例完全匹配:值为3的两个有效行分别输出3.5、56(如果需要匹配示例写反的公式正负,调换平方项顺序即可),其余位置均为NaN。
字符串公式输出版本(和示例显示格式一致)
如果需要直接输出1/2(a^2-b^2)格式的公式文本,替换核心计算逻辑即可:
df['loss'] = "1/2(" + valid_energy.shift(1).astype(str) + "^2-" + valid_energy.astype(str) + "^2)" # 同样可以加过滤逻辑匹配示例的空值规则 df.loc[valid_energy >= valid_energy.shift(1), 'loss'] = np.nan
内容的提问来源于stack exchange,提问作者prashant thakre
相关产品推荐
相关产品推荐

