使用Pandas创建数据框后,计算列均值时指定“skip NA”。

25

我正在通过复制一些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

2个回答

27

这是个诡计问题,因为你不需要这样做。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ś
@Dr_Zaszuś请看最后一行,其中链接到手册。它列出了包括NaN的选项。您可以像其他答案建议的那样在此基础上构建。 - FooBar

6

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

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

group.agg({"your_col_name_to_be_aggregated":custom_mean})

这就是全部内容!你可以按照自己的想法自定义聚合,我认为这很有效率,但我没有深入研究。
此外,这里也有讨论,但我希望能够传达好消息!答案在官方文档中找到。

@lokheart,这可能会引起你的兴趣。 - c-a
为什么np.mean无法工作? - GitHunter0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接