含NaN和数组的Pandas DataFrame行均值计算问题
解决方案:逐行排除NaN计算均值数组
首先复现问题场景:
import pandas as pd import numpy as np df = pd.DataFrame({'x' : [np.NaN, np.array([0,2])], 'y' : [np.array([3,2]),np.NaN], 'z' : [np.array([4,5]),np.NaN], 't' : [np.array([3,4]),np.array([4,5])]})
直接调用df.mean(axis=1)会返回全NaN,原因是pandas顶层mean方法无法处理行内混合NaN与数组的类型;而df.sum(axis=1)能正常工作,是因为sum逻辑会自动跳过NaN,对数组执行逐元素相加。
以下是两种更简洁的解决方案:
方法1:使用apply逐行处理
这是列表推导的简洁替代,利用Series的mean方法自动跳过NaN并计算数组逐元素均值:
result = df.apply(lambda row: row.mean(), axis=1)
输出结果:
0 [3.3333333333333335, 3.6666666666666665] 1 [2.0, 3.5] dtype: object
方法2:向量化计算(性能更优)
结合sum和非NaN元素计数实现,避免逐行循环开销,适合大数据集:
# 计算每行非NaN元素的数量 non_nan_count = df.notna().sum(axis=1) # 用逐行总和除以计数得到均值数组 result = df.sum(axis=1) / non_nan_count
此方法结果与方法1完全一致,但执行效率更高,因为sum和notna都是pandas的向量化操作。
内容的提问来源于stack exchange,提问作者user1627466
相关产品推荐
相关产品推荐

