Python中如何在if语句中检查空值并计算DataFrame列平均值?
解决DataFrame中基于空值计算两列平均值的问题
你的代码存在几个关键问题,导致无法正确实现需求:
- 直接对整个布尔Series用
if判断逻辑错误:df['A'].notnull返回的是一个布尔数组(对应每行的判断结果),不是单个布尔值,用is True比较只会判断这个Series对象本身是否等于True,完全不是逐行判断的逻辑。 - 语法错误:
&的优先级高于is,需要给每个条件单独加括号;另外else后面不能跟条件,应该用elif。 - 冗余的
is True:布尔值可以直接作为判断条件,不需要额外和True比较。
下面给你两种可行的解决方案:
方案1:修复逐行判断逻辑(用向量化条件)
用numpy.where实现嵌套的逐行判断,先统一转换数据类型避免计算错误:
import numpy as np # 先将A、B列转为浮点型,确保数值计算正常 df[['A', 'B']] = df[['A', 'B']].astype(float) # 嵌套判断赋值 df['Avg'] = np.where( (df['A'].notnull()) & (df['B'].notnull()), (df['A'] + df['B']) / 2, np.where( df['A'].notnull(), df['A'], df['B'] ) )
方案2:用pandas内置函数(最简洁高效)
pandas的mean方法默认会忽略NaN值,刚好完美匹配你的需求:
- 两列都非空时自动取平均值
- 某一列空时自动取另一列的有效值
- 若两列都空,结果会是
NaN,可按需用fillna补充默认值
代码非常简洁:
# 转换类型后直接计算行均值 df['Avg'] = df[['A', 'B']].astype(float).mean(axis=1) # 可选:处理两列都为空的情况,比如填充0 # df['Avg'] = df[['A', 'B']].astype(float).mean(axis=1).fillna(0)
内容的提问来源于stack exchange,提问作者Yuuuu
相关产品推荐
相关产品推荐

