计算其中包含 np.nan 的 pandas 数据帧的平均值的最佳方法是什么?

What is the best way to calculate the mean of the values of a pandas dataframe with np.nan in it?

我正在尝试计算包含大量 np.nan 的 pandas 数据框的值的平均值(所有这些都是数字,不像 'How to calculate the mean of a pandas DataFrame with NaN values' 问题中的那样)在里面。

我已经有了这段代码,顺便说一句,它运行得很好:

my_df = pd.DataFrame ([[0,10,np.nan,220],\
[1,np.nan,21,221],[2,12,22,np.nan],[np.nan,13,np.nan,np.nan]])

print(my_df.values.flatten()[~np.isnan(my_df.values.flatten())].mean())

然而,我发现这行代码给出了相同的结果,我不明白为什么:

print(my_df.values[~np.isnan(my_df.values)].mean())

这真的一样吗,我可以放心使用吗? 我的意思是,my_df.values[~np.isnan(my_df.values) 仍然是一个不平坦的数组,那么其中的 np.nan 发生了什么?

如果您看到更高效和 pythonic 的方法来做到这一点,欢迎任何改进。 非常感谢。

Is this really the same, and can I use it safely ?

是的,因为 numpy 在这里屏蔽掉了 NaN,然后​​它将计算该数组的平均值。但是你把它弄得太复杂了。

你可以在这里使用 numpy 的 nanmean(..) [numpy-doc]:

>>> np.nanmean(my_df)
52.2

因此不考虑 NaN 值(不在总和中,也不在平均值计数中)。我认为这可能比使用掩蔽计算平均值更具声明性,因为上面说的是 what you are doing,而不是 how you are这样做。

如果您想计算 NaN,我们可以将它们替换为 0,例如 ,例如:

>>> my_df.fillna(0).values.mean()
32.625