计算其中包含 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
我正在尝试计算包含大量 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