如何在Pandas中结合eval处理多字段空值的相对条件计算
解决方案:在Pandas eval中实现带null条件的加法运算
你可以在eval的表达式中结合Pandas的null判断函数(pd.isna/pd.notna)和三元表达式,实现你需要的逻辑:仅当单个字段为null时替换为0相加,两个字段都为null时返回null。
核心表达式
直接修改你的eval语句为:
df.eval(""" result = (fieldA if pd.notna(fieldA) else 0) + (fieldB if pd.notna(fieldB) else 0) if not (pd.isna(fieldA) & pd.isna(fieldB)) else np.nan """, inplace=True)
逻辑解释
- 先判断
fieldA和fieldB是否同时为null:如果是,结果直接设为np.nan(即你表格中的null) - 如果不是同时为null,就将单个为null的字段替换为0,再执行加法运算
完整示例代码
import pandas as pd import numpy as np # 构造测试数据 df = pd.DataFrame({ 'fieldA': [np.nan, np.nan, 4, 0], 'fieldB': [np.nan, 5, 5, 6] }) # 使用eval执行运算 df.eval(""" result = (fieldA if pd.notna(fieldA) else 0) + (fieldB if pd.notna(fieldB) else 0) if not (pd.isna(fieldA) & pd.isna(fieldB)) else np.nan """, inplace=True) print(df)
运行结果
| fieldA | fieldB | result |
|---|---|---|
| NaN | NaN | NaN |
| NaN | 5 | 5.0 |
| 4 | 5 | 9.0 |
| 0 | 6 | 6.0 |
这个方案完全基于矢量化运算,不需要循环处理,且保留了你想要的eval使用方式。
内容的提问来源于stack exchange,提问作者Solrac
相关产品推荐
相关产品推荐

