【问题标题】:What is the best way to calculate the mean of the values of a pandas dataframe with np.nan in it?计算带有 np.nan 的熊猫数据框的值的平均值的最佳方法是什么?
【发布时间】:2019-12-05 22:40:49
【问题描述】:

我正在尝试计算包含大量 np.楠在里面。

我附带了这段代码,顺便说一句,效果很好:

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 的方式来做到这一点,任何改进都是受欢迎的。 非常感谢。

【问题讨论】:

    标签: python dataframe nan mean


    【解决方案1】:

    这个真的一样吗,可以放心使用吗?

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

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

    >>> np.nanmean(my_df)
    52.2
    

    因此不考虑 NaN 值(不在总和中,也不在平均值的计数中)。我认为这可能比使用掩码计算平均值更具说明性,因为上面说的是 what 你在做什么,而不是如何 你在做什么。

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

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

    【讨论】:

    • 如果需要考虑nans 的频率,可以将nans 替换为零(即my_df.fillna(0, inplace=True)),然后计算平均值为my_df.mean()
    • @abdullah.cu: 但这意味着你也要计算nans。 nanmean 通常旨在从平均值中排除这些(所以[1,nan,2] 产生1.5,而不是1)。
    • 是的,你是对的。我指出它以防万一。
    • 谢谢!更加紧凑和优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多