在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”

Posted

技术标签:

【中文标题】在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”【英文标题】:specifying "skip NA" when calculating mean of the column in a data frame created by Pandas 【发布时间】:2014-09-22 05:49:41 【问题描述】:

我正在通过复制一些 R 小插曲的郊游来学习 Pandas 包。现在我以 R 中的 dplyr 包为例:

http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

R 脚本

planes <- group_by(hflights_df, TailNum)
delay <- summarise(planes,
  count = n(),
  dist = mean(Distance, na.rm = TRUE))
delay <- filter(delay, count > 20, dist < 2000)

Python 脚本

planes = hflights.groupby('TailNum')
planes['Distance'].agg('count' : 'count',
                        'dist' : 'mean')

如何在 python 中明确声明 NA 需要跳过?

【问题讨论】:

【参考方案1】:

这是一个棘手的问题,因为你不会这样做。 Pandas 会自动从聚合函数中排除 NaN 数字。考虑一下我的df

    b   c   d  e
a               
2   2   6   1  3
2   4   8 NaN  7
2   4   4   6  3
3   5 NaN   2  6
4 NaN NaN   4  1
5   6   2   1  8
7   3   2   4  7
9   6   1 NaN  1
9 NaN NaN   9  3
9   3   4   6  1

内部count() 函数将忽略NaN 值,mean() 也将忽略。我们获得NaN 的唯一点是唯一的值是NaN。然后,我们取一个空集的平均值,结果是NaN

In[335]: df.groupby('a').mean()
Out[333]: 
          b    c    d         e
a                              
2  3.333333  6.0  3.5  4.333333
3  5.000000  NaN  2.0  6.000000
4       NaN  NaN  4.0  1.000000
5  6.000000  2.0  1.0  8.000000
7  3.000000  2.0  4.0  7.000000
9  4.500000  2.5  7.5  1.666667

聚合函数的工作方式相同:

In[340]: df.groupby('a')['b'].agg('foo': np.mean)
Out[338]: 
        foo
a          
2  3.333333
3  5.000000
4       NaN
5  6.000000
7  3.000000
9  4.500000

附录:注意标准dataframe.mean API 将如何允许您控制NaN 值的包含,其中默认为排除

【讨论】:

谢谢,我该如何做相反的事情:让pandas 包含NaN @Dr_Zaszuś 看看最后一行,它链接到手册。它列出了包括NaN 的选项。正如其他答案所建议的那样,您可以在此基础上进行构建。【参考方案2】:

foobar 所说的关于它的默认实现方式是正确的,但是有一种非常简单的方法可以指定skipna。这是一个不言自明的例子:

def custom_mean(df):
    return df.mean(skipna=False)

group.agg("your_col_name_to_be_aggregated":custom_mean)

就是这样!你可以按照你想要的方式自定义你自己的聚合,我希望这会相当有效,但我没有深入研究它。

还讨论了here,但我想我会帮助传播这个好消息! 答案在官方doc找到。

【讨论】:

@lok​​heart,这可能会让你感兴趣。 为什么 np.mean 不起作用?

以上是关于在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”的主要内容,如果未能解决你的问题,请参考以下文章

如何将 numpy 数组存储在 Pandas 数据框的列中?

给定列名,数据框中列的平均值

在 Pandas 数据框中查找每三列的平均值

如何从 pandas 数据框中的大型每日 JSON 数据集计算平均月值?

如何在整个 Pandas 数据框中搜索字符串并获取包含它的列的名称?

如何计算另一列中特定值的列的平均值?